使用 CreateWindowExW 时堆损坏

时间:2023-03-08
本文介绍了使用 CreateWindowExW 时堆损坏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

我在堆损坏方面遇到了一些问题.使用 CreateWindowExW 函数时可以观察到警告.我知道这通常是内存错误,但在这种情况下我怎么能找到它呢?在调用 CreateWindowExW 之前没有新变量,我无法进入这个函数.这是代码.

I have some problems with heap corruption. The warning can be observed while using CreateWindowExW function. I know that it is usually a memory error, but how could I search it out in such situation? There are no new variables before calling CreateWindowExW and I can't step into this function. Here is the code.

HWND GetMainWnd(HINSTANCE hInstance){
static HWND hWnd = NULL;
if (hWnd)
    return hWnd;

RETURN_AT_ERROR(hInstance, NULL);

WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
wcex.style          = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc    = MainWndProc;
wcex.hInstance      = hInstance;
wcex.hCursor        = ::LoadCursorW(NULL, IDC_ARROW);
wcex.lpszClassName  = g_config->GetWndClass();

ATOM atom = ::RegisterClassExW(&wcex);
RETURN_AT_ERROR(atom != 0, NULL);

hWnd = ::CreateWindowExW(WS_EX_LEFT, g_config->GetWndClass(), 0, WS_POPUP | WS_MINIMIZEBOX | WS_CLIPCHILDREN, 0, 0, 0, 0, 0, 0, hInstance, 0);

return hWnd;}

在这个字符串上

hWnd = ::CreateWindowExW(WS_EX_LEFT, g_config->GetWndClass(), 0, WS_POPUP | WS_MINIMIZEBOX | WS_CLIPCHILDREN, 0, 0, 0, 0, 0, 0, hInstance, 0);

有一个警告信息框

Windows 在 drm.exe 中触发了一个断点.这可能是由于堆损坏,这表明 drm.exe 或任何它已加载的 DLL.这也可能是由于用户按了 F12而 drm.exe 有焦点.输出窗口可能有更多的诊断信息.

Windows has triggered a breakpoint in drm.exe. This may be due to a corruption of the heap, which indicates a bug in drm.exe or any of the DLLs it has loaded. This may also be due to the user pressing F12 while drm.exe has focus. The output window may have more diagnostic information.

我按继续",它显示

Unhandled exception at 0x77dae753 in app.exe: 0xC0000374: A heap has been corrupted.

然而,CreateWindowExW 返回一个非零值,并按原样创建窗口...

However CreateWindowExW returns a non-zero value and window is created as it should be...

推荐答案

如上所述,堆损坏通常是在进程中加载的某些 DLL/模块已经发生真正损坏后检测到的.从您的帖子看来,此问题是特定于 Windows 平台的,因此我建议您使用 WinDBG/Pageheap 并找出实际发生内存损坏的位置.一篇关于堆内存损坏分析的非常好的文章可以在Advanced Windows Debugging, Author: By: Mario Hewardt; Daniel Pravat"Chapter 06

As pointed out above, heap corruption is often detected after the real corruption has already occurred by some DLL/module loaded within your process. From your post it looks like this issue is windows platform specific so I would suggest you to use WinDBG/Pageheap and find out where actual memory corruption is happening. One very very good article about heap memory corruption analysis can be found from the book "Advanced Windows Debugging, Author: By: Mario Hewardt; Daniel Pravat" Chapter 06

http://advancedwindowsdebugging.com/ch06.pdf

这篇关于使用 CreateWindowExW 时堆损坏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

上一篇:如何在程序执行的最开始设置断点 下一篇:如何从 Visual Studio 2010 使用 SWIG 创建 DLL

相关文章