При вызове указателя на функцию, которая указывает на функцию 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 приводит к сбою приложения;

где я не прав?

0

Решение

Добавить эту строку в main функция:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]