2010-11-23 34 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