gpt4 book ai didi

c++ - 使用 GDI+ 注入(inject) DLL 导致记事本崩溃

转载 作者:行者123 更新时间:2023-11-27 23:32:20 26 4
gpt4 key购买 nike

我有一个由 DLL 和 EXE 组成的 Visual Studio 解决方案。我的程序设置了全局 WH_CALLWNDPROC Hook 。 Hook 过程由 DLL 定义。我已经验证 DLL 已正确注入(inject)到我感兴趣的所有进程中。DLL 导出了一些过程,这些过程是在头文件中定义的,而不是在 DEF 文件中。 EXE自动加载DLL,调用DLL中的方法设置hook。加载 DLL 时,DllMain 设置一个内部 HMODULE 变量,其中包含 DLL 的模块句柄。当 EXE 调用 installHook 过程时,DLL 设置 Hook 。所有这一切都很好。

当我的 Hook 过程接收到 WM_SIZING 消息时,它会执行另一个内部过程,该过程应该使用 GDI+ 在窗口的客户端 DC 上绘制一些东西。使用标准 GDI 是可行的。但是,GDI+(我需要使用)不起作用:Graphics::Graphics(HDC) 构造函数会在我尝试调整窗口大小时立即导致 any 程序崩溃。以下是导致崩溃的代码片段:

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+,创建 Graphics 对象,删除 Graphics 对象,释放 DC,然后关闭 GDI+。我无法想象为什么程序会因为这些行而崩溃。记事本和 Windows 资源管理器都崩溃(Windows 资源管理器窗口与 Windows 资源管理器外壳处于不同的进程中)。

谢谢!

最佳答案

很确定是下一行

 delete &graphics;

这会使您的代码崩溃。 delete 只应在指针由 new 获取时使用,这里您在堆栈上给它一些东西。在堆栈分配的变量上调用 delete 是没有意义的。

要确保在调用 GdiplusShutdown 之前销毁 Graphics 实例,您可以引入一个新的作用域:

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

关于c++ - 使用 GDI+ 注入(inject) DLL 导致记事本崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4251963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com