- #include"stdafx.h"
- #include"windows.h"
- typedefint(CALLBACK*LPFNDLLFUNC)(void);
- int_tmain(intargc,_TCHAR*argv[])
- {
- HMODULEhDll;
- hDll=LoadLibrary(L"Win32dllFirst");
- LPFNDLLFUNCfnTestDLLFun;
- if(hDll!=NULL)
- {
- fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");
- if(fnTestDLLFun!=NULL)
- {
- intresult=fnTestDLLFun();
- printf("%d",result);
- }
- else
- {
- printf("%d",GetLastError());
- }
- }
- FreeLibrary(hDll);
- return0;
- }
基于上上一篇日志《dll编程学习日志》中的例子代码,我试图学习怎么限定dll输出函数命名。
现在贴出部分代码:
Win32dllFirst.h
- classWIN32DLLFIRST_APICWin32dllFirst{
- public:
- CWin32dllFirst(void);
- //TODO:在此添加您的方法。
- };
- externWIN32DLLFIRST_APIintnWin32dllFirst;
- WIN32DLLFIRST_APIintfnWin32dllFirst(void);
生成之,拷贝到Win21dllFirstTest目录下。
Win21dllFirstTest.cpp
- //Win21dllFirstTest.cpp:定义控制台应用程序的入口点。
- //
- #include"stdafx.h"
- #include"windows.h"
- typedefint(CALLBACK*LPFNDLLFUNC)(void);
- int_tmain(intargc,_TCHAR*argv[])
- {
- HMODULEhDll;
- hDll=LoadLibrary(L"Win32dllFirst");
- LPFNDLLFUNCfnTestDLLFun;
- if(hDll!=NULL)
- {
- fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"?fnWin32dllFirst@@YAHXZ");
- if(fnTestDLLFun!=NULL)
- {
- intresult=fnTestDLLFun();
- printf("%d",result);
- }
- else
- {
- printf("%d",GetLastError());
- }
- }
- FreeLibrary(hDll);
- return0;
- }
看着这个"?fnWin32dllFirst@@YAHXZ"名字很讨厌啊。kill之。上网搜搜方案。
网上主要谈的就是extern "C",好的我就尝试,将Win32dllFirst.h代码改为:
- classWIN32DLLFIRST_APICWin32dllFirst{
- public:
- CWin32dllFirst(void);
- //TODO:在此添加您的方法。
- };
- extern"C"WIN32DLLFIRST_APIintnWin32dllFirst;
- extern"C"WIN32DLLFIRST_APIintfnWin32dllFirst(void);
生成之。用Depends.Exe打开之,这儿就会出现一个好玩的现象,把我迷惑了好长时间,甚至有段时间否认了网上的这种方案。
在没有加extern "C"时我生成这个dll,用Depends.Exe打开之出现:
??0CWin32dllFirst@@QAE@XZ
??4CWin32dllFirst@@QAEAAV0@ABV0@@Z
?fnWin32dllFirst@@YAHXZ
?nWin32dllFirst@@3HA
我没有关闭Depends.Exe。在加了extern "C"后,我用没有关闭Depends.Exe打开这个dll,还是出现上述结果。这个使我疑惑阿。后来无意间关闭了那个Depends.Exe,并重新打开它,并用之打开新的dll。才出现
??0CWin32dllFirst@@QAE@XZ
??4CWin32dllFirst@@QAEAAV0@ABV0@@Z
fnWin32dllFirst
nWin32dllFirst
再试验在类的前面和类函数前面加extern "C"。就会抱错,那么关于类的限定名怎么设置呢?继续探索。