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
,具有指向类窗口
实例的有效指针。