2010-11-23 66 views
0

我有一個由DLL和EXE組成的Visual Studio解決方案。我的程序設置了一個全局的WH_CALLWNDPROC鉤子。鉤子程序由DLL定義。我已經驗證了DLL可以正確注入到我感興趣的所有進程中.DLL導出一些過程,這些過程在頭文件中定義,而不是在DEF文件中定義。 EXE自動加載DLL並調用DLL中的方法來設置鉤子。加載DLL時,DllMain會設置一個內部HMODULE變量,其中包含DLL的模塊句柄。當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資源管理器窗口位於與Windows資源管理器Shell不同的進程中)。

謝謝!

回答

4

敢肯定這是下一行

delete &graphics; 

是使你的代碼的打擊了。 delete只能在new獲得指針時使用,在這裏你要給它一些東西。調用堆棧分配變量的刪除沒有任何意義。

爲了確保Graphics實例被銷燬前GdiplusShutdown是叫你可以引入一個新的範圍:

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

+1好發現。 – karlphillip 2010-11-23 02:11:32