.hファイルにクラスがあります。
_class Blah
{
public:
Blah(){}
virtual ~Blah(){}
void WriteMessage( bool MessageReceived )
{
if(MessageReceived)
{
cout << "Message Recieved\n";
}
}
};
_
私のコードが機能しない理由を理解しようとしていたので、WriteMessage()
関数内の条件にブレークポイントを設定しましたが、デバッグモードでプロジェクトの実行を開始するとすぐに、ブレークポイントがフェードアウトし、そのためのツールチップは言った:
ブレークポイントは現在ヒットされません。
この行に関連付けられている実行可能コードはありません。
.hファイルに実装すると、他のクラスの他のすべてのメンバー関数が問題なく機能するため、これがなぜ起こっているのかわかりません。何が原因ですか?
編集:要求通り、ここで私が作業している実際のコードの一部を取り除いたバージョンを示します。
VimbaBridgeAPI.h(.dllのヘッダーファイル)
_#pragma once
#ifdef VIMBABRIDGEAPI_EXPORTS
#define VIMBABRIDGEAPI_API __declspec(dllexport)
#else
#define VIMBABRIDGEAPI_API __declspec(dllimport)
#endif
#include "AlCamIncludes.h"
#include "VimbaSystem.h"
////////////////////////////////////////////
// Global Variables ///////////////////////
////////////////////////////////////////////
extern HBITMAP hbit;
extern CEdit* global_filenamehandle;
////////////////////////////////////////////
// Global Flags ///////////////////////////
////////////////////////////////////////////
extern bool imageReady;
extern bool take_picture;
using namespace AVT::VmbAPI;
VIMBABRIDGEAPI_API void BridgedGetImage(FramePtr framepoint, VmbUchar_t** imgDat);
VIMBABRIDGEAPI_API HBITMAP ExternalFrameRecieved( const FramePtr pFrame );
//////////////////////////////////////////////////////////////////////////
////////// MyObserver class ///////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
class VIMBABRIDGEAPI_API MyObserver : public IFrameObserver
{
private:
MyObserver( MyObserver& );
MyObserver& operator=( const MyObserver& );
//class member variables
//BITMAPINFO* pbmi;
CEdit* m_filenameedit;
public:
MyObserver(CameraPtr pCamera) : IFrameObserver(pCamera) {}
virtual ~MyObserver() {}
void FrameReceived ( const FramePtr pFrame );
};
_
注: IFrameObserverは私が作成したものではありませんが、FrameReceived関数はIFrameObserverクラスで宣言された純粋仮想です。彼らのドキュメントによると、FrameRecievedはフレームが来るたびにAPIによって呼び出され、関数を実装する必要がありました。私はこの関数をテストし、機能しましたが、クラスの外で定義された場合のみです(内部でエラーが発生しています)
VimbaBridgeAPI.cpp(ユーザーから非表示のコード)
_void FrameRecieved( const FramePtr pFrame )
{
DbgMsg(L"Frame Received\n");
////////////////////////////////////////////////////////////////////////
////////// Setup Bitmap ////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//// FILEHEADER ////
BITMAPFILEHEADER* bf = new BITMAPFILEHEADER;
bf->bfType = 0x4d42;
bf->bfSize = 6054400 + 54 + sizeof(BITMAPINFO);
bf->bfOffBits = 54;
//// INFOHEADER ////
BITMAPINFOHEADER* bih = new BITMAPINFOHEADER;
bih->biSize = 40;
bih->biWidth = 2752;
bih->biHeight = -2200;
bih->biPlanes = 1;
bih->biBitCount = 32;
bih->biCompression = 0;
//bi->biSizeImage = 6054400; //not required
bih->biXPelsPerMeter = 2835;
bih->biYPelsPerMeter = 2835;
bih->biClrUsed = 0;
bih->biClrImportant = 0;
//// INFO ////
BITMAPINFO* pbmi = (BITMAPINFO*)alloca( sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256);
pbmi->bmiHeader.biSize = sizeof (pbmi->bmiHeader);
pbmi->bmiHeader.biWidth = 2752;
pbmi->bmiHeader.biHeight = -2200;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biBitCount = 8;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiHeader.biSizeImage = 0;
pbmi->bmiHeader.biXPelsPerMeter = 14173;
pbmi->bmiHeader.biYPelsPerMeter = 14173;
pbmi->bmiHeader.biClrUsed = 0;
pbmi->bmiHeader.biClrImportant = 0;
//create grayscale color palette
for(int i=0; i<256; i++)
{
pbmi->bmiColors[i].rgbRed = BYTE(i);
pbmi->bmiColors[i].rgbGreen = BYTE(i);
pbmi->bmiColors[i].rgbBlue = BYTE(i);
pbmi->bmiColors[i].rgbReserved = BYTE(0);
}
//// IMAGE DATA ////
VmbUchar_t* imageData = NULL;
BridgedGetImage(pFrame, &imageData);
//////////////////////////////////////////////////////////////////////////
////// Create image that's printed to dialog box /////////////////////////
//////////////////////////////////////////////////////////////////////////
HDC hdc = ::GetDC(NULL);
hbit = CreateDIBitmap(hdc, bih, CBM_INIT, imageData, pbmi, DIB_RGB_COLORS);
//clean up
DeleteObject(bf);
DeleteObject(bih);
DeleteObject(hdc);
}
_
まずお勧めします出力ファイルを削除する:生成されたすべてのDLL、PDB、EXEを物理的に削除します。次に、再度コンパイル(再構築)してファイルを生成します。ソリューションを構築するときに、Visual Studioが出力ファイルを上書きして「失われる」ことや「忘れる」こともあります。
これは、他のいくつかの理由で発生する可能性があります。
私もこの問題を抱えていました。私のアプリのコンテキストは、デバッガーからステップインしたい下位層のアンマネージC++コードを使用するC#のメインアプリでした。 C#プロジェクトのプロパティから[デバッグ]タブに移動し、[デバッガーを有効にする]セクションで[アンマネージコードのデバッグを有効にする]をオンにしました。
古いMFC (managed--using clr support)
プロジェクトの一部を_"Breakpoint will not be hit..."
_に移植するときに_VS2015
_エラーが発生したことを述べておきたい。
私の問題を修正したのはこれを設定することでした:
_Configuration Properties\Linker\Debugging\Debuggable Assembly
_
...これに:
Yes (/ASSEMBLYDEBUG)
自分の解決策も取り入れたかった。 C++/CLRコードで構成されるDLLをロードするC++プロジェクトがありました。結局、スタートアッププロジェクトのデバッガーの種類を "Mixed"に設定する必要がありました。プログラムの開始後にdllが手動で読み込まれたため、「自動」は管理サポートが必要であることを検出していませんでした。
私は同じ問題を抱えていましたが、ファイルをクリーンアップするという認められた解決策は私にとってはうまくいきませんでした。私は私の問題を解決しました、そしてそれは私のコードと関係がありました。これが私の修正の詳細です。修正の手がかりが得られることを願っています。
私がやっていたことはCArchive
<<
構造体の演算子。ブレークポイントを設定すると、赤い記号が表示されます。デバッガーを起動するとすぐにシンボルがアウトラインになり、警告メッセージが表示されます:
ブレークポイントは現在ヒットしません。この行に関連付けられている実行可能コードはありません
私の関連するコードは、ブレークポイントが壊れない場所の下にあります。
class Book
{
friend CArchive& operator << (CArchive& ar, const Book & book )
{
ar << book.title;
ar << "\r\n";
ar << book.price;
ar << "\r\n";
}
}
このコードに明らかな問題があるのは、returnステートメントがないことですreturn ar
ですが、コンパイラは文句を言いませんでした。コンパイラが文句を言わなかった理由は、私が演算子を誤って使用していた(そしてそれを使用したことがなかった)ためです。
book *mybook = new Book(...);
ar << mybook;
誤ってポインタを介して演算子にアクセスしているので、オブジェクトの<<
演算子が実際に呼び出されることはありませんでした。そのため、使用されなかったためにコンパイラーは文句を言いませんでした。
だから私は最初に呼び出しコードを修正しました
book *mybook = new Book(...);
ar << *mybook;
演算子のオーバーロードメソッドがreturn
ステートメントについて文句を言うようになりました。これも修正しました。
関数に入ることができます。つまり、このコードは基本的にコンパイラーによって(正しく)サイドライン化されていたため、ブレークポイントが設定されていなかったということです。