2010-11-23 7 views
0

私は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エクスプローラシェルとは別のプロセスです)。

ありがとうございます!

答えて

4

それはあなたのコードのブローアップを行っている次の行

delete &graphics; 

あるかなり確信。 deleteは、ポインタがnewで取得された場合にのみ使用する必要があります。ここではスタックに何かを与えています。スタックに割り当てられた変数に対してdeleteを呼び出すことは意味がありません。

{ 
    Graphics g(...); 
    g.DoStuff(); 
    ... 
} // g is destroyed here 
GdiplusShutdown(...) 
+0

+1まあ発見:GdiplusShutdownは、あなたが新しいスコープを導入することができますと呼ばれる前に、グラフィックス・インスタンスが破棄されることを保証するために

。 – karlphillip

+0

私はこれにはあまり経験がありませんので、ありがとう! GDI +のドキュメントでは、すべてのGDI +オブジェクトが削除されたか、スコープ外になった後にGdiplusShutdownを呼び出す必要があると記載されています。 GdiplusShutdownはGraphicsが作成されているのと同じスコープで呼び出されているので、delete演算子を使うべきだと思いました。私は何をしなければならないのですか?それを仕事にしておき、自動的に割り当てを解除しますか? – AniDev

+1

@Ani B私はこれをどう対処するかの答えを更新しました。 –