我有一个由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