C2440无法在C ++ WinApi中将LRESULT转换为WNDPROC

时间:2011-09-06 11:07:02

标签: c++ windows winapi

我正在尝试用WinApi编写这个win32程序而且我被卡住了,因为我正在关注的教程似乎有问题。

MainWindow.h:

class MainWindow
{
  public:
    MainWindow(HINSTANCE);
   ~MainWindow(void);

    LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);

    // [...]

MainWindow.cpp:

MainWindow::MainWindow(HINSTANCE hInstance) : hwnd(0)
{
  WNDCLASSEX WndClsEx;
  // [...]
  WndClsEx.lpfnWndProc = &MainWindow::WndProcedure;
  // [...]
}

LRESULT CALLBACK MainWindow::WndProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  // [...]
}

我必须引用MainWindow :: WndProcedure错误,因为我完全按照教程所说的那样遵循签名,但是构造函数中的lpfnWndProc行给出了编译时错误:

错误C2440:'=':无法从'LRESULT(__ stdcall MainWindow :: *)(HWND,UINT,WPARAM,LPARAM)'转换为'WNDPROC'

3 个答案:

答案 0 :(得分:14)

替换

LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);

通过

static LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM);

this指针是函数调用中的隐藏参数,通过声明它是静态的,this指针不再是参数,并且两个函数的签名匹配。

答案 1 :(得分:4)

您不能将非静态成员函数用作窗口过程。如果您将WndProcedure声明为static,则应编译。非成员函数也可以。

非静态成员函数具有与静态成员不同的签名。这是因为除明确定义的参数外,它们还会收到隐式this参数。

答案 2 :(得分:4)

这是因为您的WndProcedure函数必须是全局函数或静态成员函数。