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

本文探讨了在DLL编程中如何限制导出函数的命名,通过使用extern C来避免名称修饰,确保导出函数名称的一致性。文中详细记录了修改前后使用Depends.Exe观察到的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. #include"stdafx.h"
  2. #include"windows.h"
  3. typedefint(CALLBACK*LPFNDLLFUNC)(void);
  4. int_tmain(intargc,_TCHAR*argv[])
  5. {
  6. HMODULEhDll;
  7. hDll=LoadLibrary(L"Win32dllFirst");
  8. LPFNDLLFUNCfnTestDLLFun;
  9. if(hDll!=NULL)
  10. {
  11. fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");
  12. if(fnTestDLLFun!=NULL)
  13. {
  14. intresult=fnTestDLLFun();
  15. printf("%d",result);
  16. }
  17. else
  18. {
  19. printf("%d",GetLastError());
  20. }
  21. }
  22. FreeLibrary(hDll);
  23. return0;
  24. }

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

现在贴出部分代码:

Win32dllFirst.h

  1. classWIN32DLLFIRST_APICWin32dllFirst{
  2. public:
  3. CWin32dllFirst(void);
  4. //TODO:在此添加您的方法。
  5. };
  6. externWIN32DLLFIRST_APIintnWin32dllFirst;
  7. WIN32DLLFIRST_APIintfnWin32dllFirst(void);

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

Win21dllFirstTest.cpp

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值