Вызов указателя на функцию, которая указывает на функцию 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); 
Другие вопросы по тегам