1

WinMain()関数とWinProc()関数を持つ単純なWindows APIプログラムを作成しましたが、次のエラーが発生します。

 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)
  { ..... } 

プログラムは私の本(アイバー・ホートンの最初のビジュアル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には2つの異なるタイプ(それぞれUINT_PTRとINT_PTR-主に歴史的な理由から)があるため、誤ってそれらを入れ替えると、タイプ関連のエラーが発生します。これはあなたの場合の幸運なことです:それらが同じタイプである場合、コンパイラエラーを受け取る代わりに、コードは正常にコンパイルされ、代わりに、wndprocが明らかに混合されたパラメータをに渡される理由を疑問に思うでしょう。それ!

于 2012-06-19T20:29:06.517 に答える