C++ 在0x00f85069处获取未处理的异常

C++ 在0x00f85069处获取未处理的异常,c++,winapi,visual-c++,C++,Winapi,Visual C++,我的程序中断并说 Unhandled exception at 0x00f85069 in Monopoly.exe: 0xC0000005: Access violation writing location 0x0000000c. 我做了一个win32包装器。我有两个WndProc一个是静态的,另一个不是。静态WndProc调用非静态WndProc。当我尝试获取消息时,它工作正常,但当我尝试为某个内容设置值时,它会引发异常。 这是我的两个WndProc的代码(第一个是静态的) 提前谢谢 编

我的程序中断并说

Unhandled exception at 0x00f85069 in Monopoly.exe: 0xC0000005: Access violation writing location 0x0000000c.
我做了一个win32包装器。我有两个WndProc一个是静态的,另一个不是。静态WndProc调用非静态WndProc。当我尝试获取消息时,它工作正常,但当我尝试为某个内容设置值时,它会引发异常。
这是我的两个WndProc的代码(第一个是静态的)

提前谢谢

编辑:
可变项
intz

那么,访问冲突(
0xc000005
)意味着您访问了不应该访问的内存。在本例中,它表示您正试图写入
0x0000000c
。既然您(您的调试器?)说对
z
的赋值导致了它,那么我们可以看看该符号的定义吗?还有,它真的是
z=-14
还是
z-=14


编辑:我认为您需要用指向
类窗口
实例的有效指针替换
((CREATESTRUCT*)lParam)->lpCreateParams

编辑#2:发生的情况是:在
WM_CREATE
上,您将
GWLP\u USERDATA
设置为恰好等于
NULL
的值。随后,通过调用指针上的非静态成员函数,读取该值并将其视为指向
窗口的有效指针。类成员函数是由编译器实现的,非常像这样

LRESULT CALLBACK <mangled_name ("Window::WndProc")> (Window * const this, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    // ...
}
LRESULT回调(窗口*const this、HWND-HWND、UINT消息、WPARAM-WPARAM、LPARAM-LPARAM){
// ...
}
这就是您可以在
NULL
指针上实际调用成员函数的原因。但是,一旦访问成员变量,如
z
,则会中断。编译器插入了与此类似的代码
*((int*)(this+0xc))=-14
,(顺便说一句,这意味着
z
将0xc字节放入
窗口
实例中),由于
this==NULL
,因此中断。

好吧,访问冲突(
0xc000005
)意味着您访问了不应该拥有的内存。在本例中,它表示您正试图写入
0x0000000c
。既然您(您的调试器?)说对
z
的赋值导致了它,那么我们可以看看该符号的定义吗?还有,它真的是
z=-14
还是
z-=14


编辑:我认为您需要用指向
类窗口
实例的有效指针替换
((CREATESTRUCT*)lParam)->lpCreateParams

编辑#2:发生的情况是:在
WM_CREATE
上,您将
GWLP\u USERDATA
设置为恰好等于
NULL
的值。随后,通过调用指针上的非静态成员函数,读取该值并将其视为指向
窗口的有效指针。类成员函数是由编译器实现的,非常像这样

LRESULT CALLBACK <mangled_name ("Window::WndProc")> (Window * const this, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    // ...
}
LRESULT回调(窗口*const this、HWND-HWND、UINT消息、WPARAM-WPARAM、LPARAM-LPARAM){
// ...
}

这就是您可以在
NULL
指针上实际调用成员函数的原因。但是,一旦访问成员变量,如
z
,则会中断。编译器插入了与此类似的代码
*((int*)(this+0xc))=-14
,(顺便说一句,这意味着
z
将0xc字节放入
窗口
实例中),由于
this==NULL
,该实例中断。

调用
WndProc
的对象似乎不存在(NULL?)当您试图在
z-=14
中写入内存时,会发生访问冲突,这是
this->z-=14
this
是无效指针)。那是我的猜测


也可以,访问冲突在C++术语中也不是例外。p> 您正在调用的对象
WndProc
似乎不存在(null?),并且您尝试在
z-=14
中写入内存时发生访问冲突,即
this->z-=14
this
是无效指针)。那是我的猜测


也可以,访问冲突在C++术语中也不是例外。p> 您是如何创建窗口的?是否通过
lpParam
参数将指向
Window
实例的有效指针传递给
CreateWindow()
CreateWindowEx()
函数?例如,如果窗口包装器具有
Create()
函数或类似的功能:

void Window::Create()
{
    /* ... */

    // Pass a pointer to ourselves to CreateWindow() via the lpParam parameter.
    // CreateWindow() then passes that pointer to your window procedure
    // (StaticWndProc) via WM_CREATE and WM_NCCREATE in the lpCreateParams member
    // of CREATESTRUCT. This way the window procedure will know which instance to
    // call WndProc() on.
    CreateWindow(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight,
        hWndParent, hMenu, hInstance, (LPVOID)this);

    /* ... */
}

您是如何创建窗口的?是否通过
lpParam
参数将指向
Window
实例的有效指针传递给
CreateWindow()
CreateWindowEx()
函数?例如,如果窗口包装器具有
Create()
函数或类似的功能:

void Window::Create()
{
    /* ... */

    // Pass a pointer to ourselves to CreateWindow() via the lpParam parameter.
    // CreateWindow() then passes that pointer to your window procedure
    // (StaticWndProc) via WM_CREATE and WM_NCCREATE in the lpCreateParams member
    // of CREATESTRUCT. This way the window procedure will know which instance to
    // call WndProc() on.
    CreateWindow(lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight,
        hWndParent, hMenu, hInstance, (LPVOID)this);

    /* ... */
}

z=-14我正在测试我的包装器我想你需要用一个指向
类窗口的实例的有效指针替换
((CREATESTRUCT*)lParam)->lpCreateParams
。z=-14我正在测试我的包装器我想你需要替换
((CREATESTRUCT*)lParam)->lpCreateParams
,具有指向
类窗口
实例的有效指针。