看过那本的大侠们,小弟在做消息映射雏形的时候,也就是第25页:
我想把Windows消息封装成函数来处理,于是在Cpp文件中写了如下代码:
...
#define dim(x)  sizeof(x)/sizeof(x[0])...
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK AboutDlg(HWND,UINT,WPARAM,LPARAM);
struct MESSMAP_ENTRY{
UINT message;
LONG (*lpMessProc)(HWND,UINT,WPARAM,LPARAM);
};LONG OnCreate(HWND,UINT,WPARAM,LPARAM);
LONG OnClose(HWND,UINT,WPARAM,LPARAM);
LONG OnDestroy(HWND,UINT,WPARAM,LPARAM);
...
LONG OnAbout(HWND,UINT,WPARAM,LPARAM);struct MESSMAP_ENTRY _mesEntry[]=
{
WM_CREATE,OnCreate,
WM_CLOSE,OnClose,
WM_DESTROY,OnDestroy,
WM_SIZE,OnSize,
WM_INITDIALOG,OnInitDialog,
WM_SETFOCUS,OnSetFocus,
WM_PAINT,OnPaint
};struct MESSMAP_ENTRY _cmdEntry[]=
{
IDOK,OnOK,
IDCANCEL,OnCancel,
IDM_EXIT,OnExit,
IDM_ABOUT,OnAbout,
};LONG OnInitDialog(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
MessageBox(hwnd,L"对话框初始化",L"消息",MB_OK);
return true;
}LONG OnOK(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
EndDialog(hwnd,IDOK);
return true;
}
...LONG OnDestroy(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
PostQuitMessage(0);
return true;
}
BOOL InitApplication(HINSTANCE hinstance)
{
...
}BOOL InitInstance(HINSTANCE hinstance,int cmdshow)
{
...
}int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hpreinstance,LPSTR ncmdshow,int ncmdline)
{

...
}LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
{
case WM_COMMAND:
{
WORD menuId=LOWORD(wParam);
for (int i=0;i<dim(_cmdEntry);i++)
{
                if(_cmdEntry[i].message==menuId)
return (*_cmdEntry[i].lpMessProc)(hwnd,msg,wParam,lParam);
}
}    


default:
for (int i=0;i<dim(_mesEntry);i++)
{
if(_mesEntry[i].message==msg)
return (*_mesEntry[i].lpMessProc)(hwnd,msg,wParam,lParam);
} }
return 0;
}LRESULT CALLBACK AboutDlg(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
    switch(msg)
{
case WM_COMMAND:
{
WORD menuId=LOWORD(wParam);
for (int i=0;i<dim(_cmdEntry);i++)
{
if(_cmdEntry[i].message==menuId)
return (*_cmdEntry[i].lpMessProc)(hwnd,msg,wParam,lParam);
}
}    
default:
for (int i=0;i<dim(_mesEntry);i++)
{
if(_mesEntry[i].message==msg)
return (*_mesEntry[i].lpMessProc)(hwnd,msg,wParam,lParam);
}
}
return false;
}
然后我编译了一下工程,结果报了6个错误,消息如下:
ModuleWin.obj : error LNK2001: 无法解析的外部符号 "long __cdecl OnPaint(struct HWND__ *,unsigned int,unsigned int,long)" (?OnPaint@@YAJPAUHWND__@@IIJ@Z)
ModuleWin.obj : error LNK2001: 无法解析的外部符号 "long __cdecl OnSetFocus(struct HWND__ *,unsigned int,unsigned int,long)" (?OnSetFocus@@YAJPAUHWND__@@IIJ@Z)
ModuleWin.obj : error LNK2001: 无法解析的外部符号 "long __cdecl OnSize(struct HWND__ *,unsigned int,unsigned int,long)" (?OnSize@@YAJPAUHWND__@@IIJ@Z)
ModuleWin.obj : error LNK2001: 无法解析的外部符号 "long __cdecl OnClose(struct HWND__ *,unsigned int,unsigned int,long)" (?OnClose@@YAJPAUHWND__@@IIJ@Z)
ModuleWin.obj : error LNK2001: 无法解析的外部符号 "long __cdecl OnCreate(struct HWND__ *,unsigned int,unsigned int,long)" (?OnCreate@@YAJPAUHWND__@@IIJ@Z)
D:\文档\程序\C++程序\Windows编程\Window1\Debug\ModuleWin.exe : fatal error LNK1120: 5 个无法解析的外部命令
请问各位大侠如何解决。

解决方案 »

  1.   

    为什么以OnXXX开头的消息映射函数找不到呢?
      

  2.   

    在这些函数前面加上WINAPI 也就是说LONG OnPaint(...) 改成LONG WINAPI OnPaint(...)试下
      

  3.   

    没用呀,加上WINAPI之后,就变成函数调用约定不匹配了。是不是函数声明,使用和定义体的顺序不对呀?
      

  4.   

    你用什么编译的
    文件名是cpp还是c阿
    我看怎么是没有extern "C" {
    ...
    }
    的问题阿确保函数使用C调用或者C++调用,总之要一致