windows api程序中出错:无法从';LRESULT(uu stdcall*)(HWND、UINT、LPARAM、WPARAM)至WNDPROC

windows api程序中出错:无法从';LRESULT(uu stdcall*)(HWND、UINT、LPARAM、WPARAM)至WNDPROC,windows,winapi,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

我制作了一个简单的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)
  { ..... } 
错误C2440:“=”:无法从“LRESULT(u stdcall*)(HWND、UINT、LPARAM、WPARAM)”转换为“WNDPROC”
1> 此转换需要重新解释转换、C样式转换或函数样式转换
#包括
LRESULT回调WindowProc(HWND-HWND,UINT消息,LPARAM-LPARAM,WPARAM-WPARAM);
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE HPPreInstance、LPSTR lpCmdLine、int nCmdShow)
{
WNDCLASSEX窗口类;
静态LPCTSTR szAppName=L“OFWin”;
HWND-HWND;
味精;
WindowClass.cbSize=sizeof(WNDCLASSEX);
WindowClass.style=CS_HREDRAW | CS_VREDRAW;
WindowClass.lpfnWndProc=WindowProc;//错误
....
}
LRESULT回调WindowProc(HWND HWND,UINT消息,LPARAM LPARAM,WPARAM WPARAM)
{ ..... } 
这个程序是从我的书(Ivor HORT的开始Visual C++ 2010)逐字逐句地看的,怎么了?< /P>
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显然会得到传递给它的混淆参数

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

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

WPARAM和LPARAM有两种不同的类型(分别是UINT_PTR和INT_PTR,这主要是出于历史原因),因此如果不小心交换它们,就会出现与类型相关的错误。在您的情况下,这是一件幸运的事情:如果它们是相同的类型,那么代码将不会出现编译器错误,而是可以很好地编译,而您将花费一些时间来思考为什么wndproc显然会得到传递给它的混淆参数

搜索您发布的错误消息时发现了前面的问题:。在提问之前,请至少做一次基本的搜索,看看这里是否已经有类似的搜索;它减少了重复,有助于减少混乱。谢谢。@KenWhite-似乎不是您提到的qu的dup,虽然它们都有相同的错误消息,但情况似乎完全不同:在另一个qu中,问题是WndProc是一个非静态类成员,因此需要将其更改为静态;这里的情况并非如此(除非OP省略了代码)。@BrendanMcK,显然是这样。这两个问题都是关于同一语言中相同代码产生的相同错误信息(这篇文章提到了C++中的最后一句话);唯一缺少的是链接帖子中的一个参考,它指向了复制代码的那本书。诚实的错误。:-)(顺便说一句,很好地抓住了这个问题。)在搜索您发布的错误消息时发现了前面的问题:。在提问之前,请至少做一次基本的搜索,看看这里是否已经有类似的搜索;它减少了重复,有助于减少混乱。谢谢。@KenWhite-似乎不是您提到的qu的dup,虽然它们都有相同的错误消息,但情况似乎完全不同:在另一个qu中,问题是WndProc是一个非静态类成员,因此需要将其更改为静态;这里的情况并非如此(除非OP省略了代码)。@BrendanMcK,显然是这样。这两个问题都是关于同一语言中相同代码产生的相同错误信息(这篇文章提到了C++中的最后一句话);唯一缺少的是链接帖子中的一个参考,它指向了复制代码的那本书。诚实的错误。:-)(顺便说一句,抓得不错。)