windows api程序出错:无法从'LRESULT(__ stdcall *)(HWND,UINT,LPARAM,WPARAM)转换为WNDPROC

时间:2012-06-19 18:04:32

标签: windows winapi

我做了一个简单的windows api程序,它具有WinMain()和WinProc()函数,但是我收到了这个错误:

 error C2440: '=' : cannot convert from 'LRESULT (__stdcall *)(HWND,UINT,LPARAM,WPARAM)'    to 'WNDPROC'
 1> This conversion requires a reinterpret_cast, a C-style cast or function-style cast


  #include<windows.h>

 LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, LPARAM lParam, WPARAM wParam);


 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
 {
  WNDCLASSEX WindowClass;

  static LPCTSTR szAppName = L"OFWin";
  HWND hWnd;
  MSG msg;

  WindowClass.cbSize = sizeof(WNDCLASSEX);

  WindowClass.style = CS_HREDRAW | CS_VREDRAW;
  WindowClass.lpfnWndProc = WindowProc;               // error
          ....
  }

  LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, LPARAM lParam, WPARAM wParam)
  { ..... } 

该程序从我的书中逐字逐句地开始(ivor horton开始使用visual c ++ 2010),出了什么问题?

1 个答案:

答案 0 :(得分:4)

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, LPARAM lParam, WPARAM wParam);

这是你的问题:LPARAM和WPARAM是向后的,它应该是:

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

WPARAM和LPARAM有两种不同的类型(分别由于历史原因而分别为UINT_PTR和INT_PTR),因此如果您不小心交换了它们,则会出现与类型相关的错误。在你的情况下这是一个幸运的事情:如果它们是相同的类型,那么代码编译错误,代码将编译正常,你会花一些时间想知道为什么你的wndproc显然混合参数传递给它!