我有一個由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不同的進程中)。
謝謝!
+1好發現。 – karlphillip 2010-11-23 02:11:32