个重要的导出函数指定了四个顺序号。 Windows 平台上通
常用两种方式定位 DLL 文件中的导出 函数,一种是根据导出函数名称,一种是根据顺序号,上学时曾经写过一个显示图片的
程序,能处理大多 数当时流行的图像格式文件,唯独 jpeg 格式的搞不定,有一次看到一个图像处理
软件中包含了一个 LoadJpeg.dll,很显然这个 DLL 是处理 jpeg 格式的图像文件的嘛,于是赶快用 depends look 了一下,顿 时高喊:鬼啊~~~。原来这个 depends 竟然查不到导出函数的名字,后来才知道还有 NONAME 参数强
制用顺序号定位导出函数,于是就常常弄个没有导出函数名字的 DLL 到处 show。。。。嗯,又扯远了。 话说为什么旧的
系统要以此指定这四个导出函数的顺序号我就没有研究了,反正现在不需要指定了,只要 将@1,@2 之类的删除就行了,不过不删好像也没什么问题,它们会被自动忽略。
六、使用 MFC 的消息映射宏引起的编译错误 错误现象之一:
f:\project\.....\plusmaindlg.cpp(220) : error C2440: 'static_cast' : cannot convert from 'void (__thiscall CPlusMainDlg::* )(int,BOOL)' to 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)' None
of the functions with this name in scope match the target type 错误现象之二: f:\project\.....\crpfileopavdlg.cpp(87) : error C2440: 'static_cast' : cannot convert from 'LRESULT (__thiscall CCrpFileOpavDlg::* )(LPCTSTR,int)' to 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)' None of the functions with this name in scope match the target type 以上两个编译错误产生是因为新旧版本的 MFC 中对 ON_MESSAGE 消息映射宏定义不同引起的,先 看看老版本的 MFC 的 ON_MESSAGE 消息宏定义:
#define ON_MESSAGE(message, memberFxn) \ { message, 0, 0, 0, AfxSig_lwl, \ (AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))&;memberFxn }, 再看看新版本的 ON_MESSAGE 定义:
#define ON_MESSAGE(message, memberFxn) \ { message, 0, 0, 0, AfxSig_lwl, \ (AFX_PMSG)(AFX_PMSGW) \ (static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > \ (memberFxn)) }, 注意,函数类型没有变化,都是: LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM); 类型的函数指针(CWnd 以及派生类的类成员函数指针),区别之处是新的 ON_MESSAGE 宏使用