Вызов указателя на функцию, которая указывает на функцию C в процедуре Windows, приводит к сбою приложения
У меня есть этот main.cpp код:
#include <windows.h>
#include <commctrl.h>
#include <process.h>
#include <stdio.h>
void click(){printf("button clicked\n");}
struct WindowData
{
void (*PF)();
WindowData():PF(NULL){}
};
LRESULT CALLBACK dialog_procedure(HWND h,UINT u,WPARAM w,LPARAM l)
{
WindowData *wp=(WindowData*)GetWindowLongPtr(h,GWL_USERDATA);
switch(u)
{
case WM_COMMAND:
if(LOWORD(w)==BN_CLICKED)
if(wp && wp->PF)wp->PF();
break;
}
return DefWindowProc(h,u,w,l);
}
int main()
{
WindowData * windowdata=new WindowData();
windowdata->PF=click; //bind function
HWND window=CreateWindow(WC_DIALOG,"App",WS_VISIBLE|WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_CLIPSIBLINGS,0,0,300,300,0,0,0,windowdata);
HWND button=CreateWindow(WC_BUTTON,"Click",WS_VISIBLE|WS_CHILD,0,0,100,30,0,0,0,0);
SetWindowLongPtr(window,GWL_WNDPROC,(LONG_PTR)dialog_procedure);
MSG msg;
while(GetMessage(&msg,NULL,0,0)>0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 1;
}
Теперь я собираю все с: C++ main.cpp -lcomctl32
Запустите исполняемый файл
но когда я нажимаю кнопку "Нажми", PF никогда не вызывается...
вызов windowdata->PF() после привязки работает;
вызов click() в любом месте в dialog_procedure работает;
вызов wp->PF() в любом месте dialog_procedure приводит к сбою приложения;
где я не прав?
1 ответ
Добавить эту строку в main
функция:
SetWindowLongPtr(window,GWL_USERDATA,(LONG_PTR)windowdata);