1

我制作了一个简单的 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's beginning visual c++ 2010),有什么问题?

4

1 回答 1

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 显然会混淆传递给的参数它!

于 2012-06-19T20:29:06.517 回答