关于dll输出函数被编译器改名的一些发现

来源:互联网 发布:centos 7 kvm 桥接 编辑:程序博客网 时间:2024/04/29 18:49
  1. #include "stdafx.h"
  2. #include "windows.h"
  3. typedef int (CALLBACK * LPFNDLLFUNC)(void); 
  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6.     HMODULE hDll;
  7.     hDll=LoadLibrary(L"Win32dllFirst");
  8.     LPFNDLLFUNC fnTestDLLFun;
  9.     if(hDll!=NULL)
  10.     {
  11.         fnTestDLLFun = (LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");
  12.         if(fnTestDLLFun!=NULL)
  13.         {
  14.             int result=fnTestDLLFun();
  15.             printf("%d",result);
  16.         }
  17.         else
  18.         {
  19.             printf("%d",GetLastError());
  20.         }
  21.     }
  22.     FreeLibrary(hDll);
  23.     return 0;
  24. }

 基于上上一篇日志《dll编程学习日志》中的例子代码,我试图学习怎么限定dll输出函数命名。

现在贴出部分代码:

Win32dllFirst.h

  1. class WIN32DLLFIRST_API CWin32dllFirst {
  2. public:
  3.     CWin32dllFirst(void);
  4.     // TODO: 在此添加您的方法。
  5. };
  6. extern WIN32DLLFIRST_API int nWin32dllFirst;
  7. WIN32DLLFIRST_API int fnWin32dllFirst(void);

生成之,拷贝到Win21dllFirstTest目录下。

Win21dllFirstTest.cpp

  1. // Win21dllFirstTest.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "windows.h"
  5. typedef int (CALLBACK * LPFNDLLFUNC)(void);
  6. int _tmain(int argc, _TCHAR* argv[])
  7. {
  8.     HMODULE hDll;
  9.     hDll=LoadLibrary(L"Win32dllFirst");
  10.     LPFNDLLFUNC fnTestDLLFun;
  11.     if(hDll!=NULL)
  12.     {
  13.         fnTestDLLFun = (LPFNDLLFUNC)GetProcAddress(hDll,"?fnWin32dllFirst@@YAHXZ");
  14.         if(fnTestDLLFun!=NULL)
  15.         {
  16.             int result=fnTestDLLFun();
  17.             printf("%d",result);
  18.         }
  19.         else
  20.         {
  21.             printf("%d",GetLastError());
  22.         }
  23.     }
  24.     FreeLibrary(hDll);
  25.     return 0;
  26. }

看着这个"?fnWin32dllFirst@@YAHXZ"名字很讨厌啊。kill之。上网搜搜方案。

网上主要谈的就是extern "C",好的我就尝试,将Win32dllFirst.h代码改为:

  1. class WIN32DLLFIRST_API CWin32dllFirst {
  2. public:
  3.     CWin32dllFirst(void);
  4.     // TODO: 在此添加您的方法。
  5. };
  6. extern "C" WIN32DLLFIRST_API int nWin32dllFirst;
  7. extern "C" WIN32DLLFIRST_API int fnWin32dllFirst(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"。就会抱错,那么关于类的限定名怎么设置呢?继续探索。

原创粉丝点击