必须调用lpfnWndProc成员函数

时间:2014-04-28 07:12:13

标签: c++ windows borland-c++

我有一个需要检测插入新设备的应用。 但我在“wndClass.lpfnWndProc = reinterpret_cast(WndProcTest);”上收到错误。错误是“必须调用成员函数或其地址”。 我使用Borland C ++ builder 6。 也许有人知道我做错了什么?

我的代码AppMainForm.cpp:

bool TAppMainForm::InitWindowClass()
{
    WNDCLASSEX wndClass;

    wndClass.cbSize = sizeof(WNDCLASSEX);
    wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
    wndClass.hInstance = reinterpret_cast<HINSTANCE>(GetModuleHandle(0));
    wndClass.lpfnWndProc = reinterpret_cast<WNDPROC>(WndProcTest );
    wndClass.cbClsExtra = 0;
    wndClass.cbWndExtra = 0;
    wndClass.hIcon = LoadIcon(0,IDI_APPLICATION);
    wndClass.hbrBackground = CreateSolidBrush(RGB(192,192,192));
    wndClass.hCursor = LoadCursor(0, IDC_ARROW);
    wndClass.lpszClassName = g_szClassName;
    wndClass.lpszMenuName = NULL;
    wndClass.hIconSm = wndClass.hIcon;

    if ( ! RegisterClassEx(&wndClass) )
    {
        //ErrorHandler(TEXT("RegisterClassEx"));
        return false;
    }
    return true;
}

INT_PTR WINAPI TAppMainForm::WndProcTest(
        HWND hWnd,
        UINT message,
        WPARAM wParam,
        LPARAM lParam
    )
{
    // do something
}

标题文件:

public: 
    bool InitWindowClass();
    INT_PTR WINAPI WndProcTest(
        HWND hWnd,
        UINT message,
        WPARAM wParam,
        LPARAM lParam
    );

2 个答案:

答案 0 :(得分:0)

您遇到的问题是您尝试获取C ++成员函数的地址并将其指定给指向C函数的指针lpfnWndProc

答案 1 :(得分:0)

解决此问题的可能方法:

  1. 将成员函数设为静态

  2. 不要使用成员函数

  3. 将函数声明为静态

    静态 INT_PTR WINAPI WndProcTest(....) { // 做点什么 }

    wndClass.lpfnWndProc = reinterpret_cast(InitWindowClass::WndProcTest);

  4. 使 WndProcTest 成为老式的 C 函数(并将其从类中删除):

    INT_PTR WINAPI WndProcTest(....) { // 做点什么 }