`
yiyeqinghuasoon
  • 浏览: 649248 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
  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"。就会抱错,那么关于类的限定名怎么设置呢?继续探索。

分享到:
评论

相关推荐

    自己写的dll的简介

    此外还可以加载其他语言编写的DLL函数。 静态调用使用简单,但不能控制DLL加载时机,EXE加载到内存同时自动加载DLL到内存,EXE退出时DLL也被卸载。 创建DLL 下面我们着重讲解如何在VC下创建DLL 首先要建立一个Win...

    MingW VC 之.a .lib .dll .def 关系

    只有注明EXPORT的函数才能出现在dll的输出表中,外部函数才能调用。 关于函数调用约定__cdecl 还是 __stdcall。我们可以在输出函数名前添加,也可以用cl编译的时候指明 /Gd 使用 __cdecl 调用约定 (C declaration,是...

    C/C++笔试题(附答案,华为面试题系列)

    DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的 出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了 。 27.IP组播有那些好处? 答:Internet上产生的许多新的应用,特别是高...

    改名“脚本魔术师”

    全面改变 CFileIO 的接口函数,原有函数名将都已被替换:参数:fNumber 未指定将用 Openfile 打开的句柄 '打开文件,返回一个文件号 OpenFile(文件名[,xType As String = "output"]) '写入二...

    LuaBind 源码 (Lua增强库)

    成员函数被视同非常量成员函数. 如果你测试了LuaBind和其他未列出的编译器的兼容性,请告诉我们你的结果. 4 构建LuaBind 为了抑制LuaBind的编译时间最好是将其编译为一个库. 这意味着你要不编译并连接LuaBind 库...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    一、Qt Creator 的安装和hello world 程序的编写(原创) 1.首先到Qt 的官方网站上下载Qt Creator,这里我们下载windows 版的。 ...for Windows* (178Mb) ...我们可以将生成的/new/prefix 前缀改为其他名字,如/File。 ...

    VC++6.0核心编程源码.rar

    这样,当某些函数运行成功时,你就能够通过调用GetLadtError函数来确定其他的一些信息。对于具有这种行为特性的函数来说,Platform SDK资料清楚地说明了GetLastError函数可以这样来使用。请参见该资料,以便找出...

    c#学习笔记.txt

    如前所述,我是一个狮子座男人,一度我认为学习Java会使我看起来与众不同,可是几个月以后我放弃了这个选择,我看了论坛里关于这两种语言孰优孰劣的讨论,最终选择了C#,请不要问我为何做出这样的选择,很多人认为...

    C#微软培训资料

    14.4 继承中关于属性的一些问题.169 14.5 小 结 .172 第四部分 深入了解 C#.174 第十五章 接 口 .174 15.1 组件编程技术 .174 15.2 接 口 定 义 .177 15.3 接口的成员 .178 15.4 接口的实现 .182 ...

    Delphi5开发人员指南

    9.11.1 一个可以被共享数据的DLL 256 9.11.2 访问DLL中的共享数据 259 9.12 引出DLL中的对象 261 9.13 总结 265 第10章 Delphi 5的打印 266 10.1 TPrinter对象 266 10.2 TPrinter.Canvas 267 10.3 简单打印 267 ...

    JNI技术手册 c/c++调用java

    3) 在C工程Cpro下建立hello.def文件(用于定义导出的函数),内容为: 40 4) 在C工程Cpro下建立makefile文件,内容为: 40 5) Make Targets 40 6) Make Targets视图下双击step1,在C工程Cpro下生成hello.o 文件。 41...

    Reversing:逆向工程揭密

    不错的PDF电子书,共3个分卷,点我名字可以找全 第1部分 逆向101 第1章 基础 3 1.1 什么是逆向工程 3 1.2 软件逆向工程:逆向 4 1.3 逆向应用 4 1.3.1 与安全相关的逆向 5 1.3.2 软件开发中的逆向 8 1.4 底层软件 ...

    易语言程序免安装版下载

    6) 修改MYSQL支持库跨静态编译的EXE和DLL传递连接句柄和记录集句柄无效的BUG(改动较大,可能会产生兼容性问题,我们已经仔细测试,也请使用到此库的用户帮助我们多多测试,以便及早发现问题,谢谢) 7) 其它修改 ...

    Symbian OS C++高效编程

    24420.6 编译器生成的函数 24520.7 小结 246第21章 良好的编码风格 24821.1 减小代码尺寸 24821.2 小心地使用堆内存 25021.3 小心地使用栈内存 25421.4 消除子表达式,最大化代码效率 25621.5 推迟...

    editplus 代码编辑器html c++ jsp css

    具体解决方法,在 Editplus 中使用正则表达式,由于“(”、“)”被用做预设表达式(或者可以称作子表达式)的标志,所以查找 “ \n” 时会提示查找不到,所以也就无法进行替换了,这时可以把“(”、“)”使用任意...

    EditPlus 2整理信箱的工具

    注意:其实就是正则表达式替换,这里只是把一些曾经提出的问题加以整理,单纯从正则表达式本身来说,就可以引申出成千上万种特例。 【2】正则表达式应用——数字替换 (Microshaoft@CCF,jiuk2k@CCF) 希望把 ...

    Editplus 3[1].0

    注意:其实就是正则表达式替换,这里只是把一些曾经提出的问题加以整理,单纯从正则表达式本身来说,就可以引申出成千上万种特例。 【2】正则表达式应用——数字替换 (Microshaoft@CCF,jiuk2k@CCF) 希望把 ...

Global site tag (gtag.js) - Google Analytics