C++ 调用指向windows过程中C函数的函数的成员指针会导致应用程序崩溃

C++ 调用指向windows过程中C函数的函数的成员指针会导致应用程序崩溃,c++,winapi,mingw,member-function-pointers,wndproc,C++,Winapi,Mingw,Member Function Pointers,Wndproc,我有这个main.cpp代码: #包括 #包括 #包括 #包括 void click(){printf(“单击的按钮”);} 结构窗口数据 { 无效(*PF)(); WindowData():PF(NULL){} }; LRESULT回调对话框\u过程(HWND h、UINT u、WPARAM w、LPARAM l) { WindowData*wp=(WindowData*)GetWindowLongPtr(h,GWL_USERDATA); 开关(u) { case WM_命令: 如果(LOWO

我有这个main.cpp代码:

#包括
#包括
#包括
#包括
void click(){printf(“单击的按钮”);}
结构窗口数据
{
无效(*PF)();
WindowData():PF(NULL){}
};
LRESULT回调对话框\u过程(HWND h、UINT u、WPARAM w、LPARAM l)
{
WindowData*wp=(WindowData*)GetWindowLongPtr(h,GWL_USERDATA);
开关(u)
{
case WM_命令:
如果(LOWORD(w)=BN_)
如果(wp&&wp->PF)wp->PF();
打破
}
返回DefWindowProc(h、u、w、l);
}
int main()
{
WindowData*WindowData=新建WindowData();
windowdata->PF=单击;//绑定函数
HWND window=CreateWindow(WC_对话框,“应用程序”,WS_可见| WS_重叠窗口| WS_客户端儿童| WS_客户端,0,0300,0,0,windowdata);
HWND button=CreateWindow(WC_按钮,“点击”,WS_可见| WS_子项,0,0100,30,0,0,0,0);
SetWindowLongPtr(窗口,GWL_WNDPROC,(长PTR)对话框程序);
味精;
while(GetMessage(&msg,NULL,0,0)>0)
{
翻译信息(&msg);
发送消息(&msg);
}
返回1;
}

<强>现在我用C++ + Me.CPP -LCOMCTL32 < /强> < /P>构建所有的所有文件 运行可执行文件

但当我按下“点击”按钮时,PF永远不会被调用

绑定后调用windowdata->PF(),工作正常

在dialog_过程中的任意位置调用click()

在对话框的任意位置调用wp->PF()会导致应用程序崩溃


我哪里错了?

将此行添加到
主功能中:

SetWindowLongPtr(window,GWL_USERDATA,(LONG_PTR)windowdata); 

您的代码
SetWindowLongPtr(window,GWL_USERDATA,(LONG_PTR)windowdata)中缺少此项非常感谢!!!:)createstruct的最后一个成员仅在WM_CREATE message with createstruct and blablablabla….@AlexFarber:您应该将其作为答案写入,以便freesoft可以接受它,而不是编辑要解析的标题。您还忘了将未处理的消息转发到原始窗口过程。实际上,你为什么不首先使用CreateDialpg呢?为什么要手动创建一个WC_对话框,然后扔掉它的窗口过程?(由于原始窗口过程不再需要进行清理,因此现在出现内存泄漏。)