关于dll输出函数被编译器改名的一些发现
来源:互联网 发布:centos 7 kvm 桥接 编辑:程序博客网 时间:2024/04/29 18:49
- #include "stdafx.h"
- #include "windows.h"
- typedef int (CALLBACK * LPFNDLLFUNC)(void);
- int _tmain(int argc, _TCHAR* argv[])
- {
- HMODULE hDll;
- hDll=LoadLibrary(L"Win32dllFirst");
- LPFNDLLFUNC fnTestDLLFun;
- if(hDll!=NULL)
- {
- fnTestDLLFun = (LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");
- if(fnTestDLLFun!=NULL)
- {
- int result=fnTestDLLFun();
- printf("%d",result);
- }
- else
- {
- printf("%d",GetLastError());
- }
- }
- FreeLibrary(hDll);
- return 0;
- }
基于上上一篇日志《dll编程学习日志》中的例子代码,我试图学习怎么限定dll输出函数命名。
现在贴出部分代码:
Win32dllFirst.h
- class WIN32DLLFIRST_API CWin32dllFirst {
- public:
- CWin32dllFirst(void);
- // TODO: 在此添加您的方法。
- };
- extern WIN32DLLFIRST_API int nWin32dllFirst;
- WIN32DLLFIRST_API int fnWin32dllFirst(void);
生成之,拷贝到Win21dllFirstTest目录下。
Win21dllFirstTest.cpp
- // Win21dllFirstTest.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include "windows.h"
- typedef int (CALLBACK * LPFNDLLFUNC)(void);
- int _tmain(int argc, _TCHAR* argv[])
- {
- HMODULE hDll;
- hDll=LoadLibrary(L"Win32dllFirst");
- LPFNDLLFUNC fnTestDLLFun;
- if(hDll!=NULL)
- {
- fnTestDLLFun = (LPFNDLLFUNC)GetProcAddress(hDll,"?fnWin32dllFirst@@YAHXZ");
- if(fnTestDLLFun!=NULL)
- {
- int result=fnTestDLLFun();
- printf("%d",result);
- }
- else
- {
- printf("%d",GetLastError());
- }
- }
- FreeLibrary(hDll);
- return 0;
- }
看着这个"?fnWin32dllFirst@@YAHXZ"名字很讨厌啊。kill之。上网搜搜方案。
网上主要谈的就是extern "C",好的我就尝试,将Win32dllFirst.h代码改为:
- class WIN32DLLFIRST_API CWin32dllFirst {
- public:
- CWin32dllFirst(void);
- // TODO: 在此添加您的方法。
- };
- extern "C" WIN32DLLFIRST_API int nWin32dllFirst;
- 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"。就会抱错,那么关于类的限定名怎么设置呢?继续探索。
- 关于dll输出函数被编译器改名的一些发现
- 解决在VS2010下利用def文件使dll输出函数不改名的方法
- 关于二值化函数cvAdaptiveThreshold的一些发现
- 关于输出对话框的DLL 函数
- 关于二值化函数cvAdaptiveThreshold和cvThreshold的一些发现
- 关于二值化函数cvAdaptiveThreshold和cvThreshold的一些发现
- 关于dll的函数
- 关于DLL的函数
- 关于DLL的函数:
- 关于DLL的函数
- 关于DLL的函数
- 关于DLL的函数
- 关于DLL的函数
- 关于printf()输出函数的一些用法
- 关于DLL的一些摘录
- 关于dll的一些知识
- 关于dll的一些事
- 关于dll的一些事
- javascript积累
- 什么样的站点可以入侵
- Lucene对老系统增加全文检索的看法
- 经典书籍
- ADS开发简介(二) 环境配置和工具使用
- 关于dll输出函数被编译器改名的一些发现
- 如果你需要对对话框上的一个按钮进行鼠标停靠提示
- 第一个Ubuntu追随者
- 超级变态让div span dd可以当文本框用
- Java与MySQL优化之旅(一)——从14小时到40秒
- 需求分析
- 急求~~09年全国计算机二级C++考试辅导材料下载~~~
- 我的MBTI性格测试结果
- 联谊会