私はDLLとEXEで構成されるVisual Studioソリューションを持っています。私のプログラムは、グローバルWH_CALLWNDPROC
フックを設定します。フックプロシージャは、DLLによって定義されます。興味のあるすべてのプロセスにDLLが正しく注入されることを確認しました.DEFファイルではなく、ヘッダーファイルに定義されているいくつかのプロシージャをエクスポートします。 EXEは自動的にDLLをロードし、フックを設定するDLLのメソッドを呼び出します。 DLLがロードされると、DllMain
はDLLのモジュールハンドルを含む内部のHMODULE
変数を設定します。 EXEがinstallHook
プロシージャを呼び出すと、DLLはフックを設定します。すべてこれはうまく動作します。GDI +を使用して注入されたDLLにより、メモ帳がクラッシュする
私のフックプロシージャがWM_SIZING
メッセージを受信すると、別の内部プロシージャが実行されます。このプロシージャは、GDI +を使用してウィンドウのクライアントDC
に何かを描画することになっています。標準GDIを使用して動作します。しかし、私が使用する必要があるGDI +は機能しません:Graphics::Graphics(HDC)
コンストラクタは、ウィンドウのサイズを変更しようとするとすぐに任意のプログラムをクラッシュさせます。ここでクラッシュの原因となるコードの抜粋である:
void myFaultyProcedure(HWND hWnd) {
RECT wndRect;
GetWindowRect(hWnd,&wndRect);
unsigned int wndWidth=wndRect.right-wndRect.left;
unsigned int wndHeight=wndRect.bottom-wndRect.top;
HDC hDc;
PAINTSTRUCT ps;
ULONG_PTR gdiplusToken;
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&gdiplusToken,&gdiplusStartupInput,NULL);
hDc=BeginPaint(hWnd,&ps);
Graphics graphics(hDc); // I think that this causes the program to crash
delete &graphics;
EndPaint(hWnd,&ps);
ReleaseDC(hWnd,hDc);
GdiplusShutdown(gdiplusToken);
}
コードは、指定されたウィンドウの幅と高さを計算するDCを取得し、GDI +が起動し、グラフィックスオブジェクトを作成し、グラフィックスオブジェクトを削除し、リリースDC、GDI +をシャットダウンします。私はなぜこれらの行のためにプログラムがクラッシュするのかをイメージすることはできません。メモ帳とWindowsエクスプローラの両方がクラッシュします(エクスプローラウィンドウはWindowsエクスプローラシェルとは別のプロセスです)。
ありがとうございます!
+1まあ発見:GdiplusShutdownは、あなたが新しいスコープを導入することができますと呼ばれる前に、グラフィックス・インスタンスが破棄されることを保証するために
。 – karlphillip
私はこれにはあまり経験がありませんので、ありがとう! GDI +のドキュメントでは、すべてのGDI +オブジェクトが削除されたか、スコープ外になった後にGdiplusShutdownを呼び出す必要があると記載されています。 GdiplusShutdownはGraphicsが作成されているのと同じスコープで呼び出されているので、delete演算子を使うべきだと思いました。私は何をしなければならないのですか?それを仕事にしておき、自動的に割り当てを解除しますか? – AniDev
@Ani B私はこれをどう対処するかの答えを更新しました。 –