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

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

分享到:
评论

相关推荐

    DLLimpLibTool-DLL函数导入静态库生成改名等工具集

    生成静态导入库(.lib)的主要目的是让编译器知道哪些DLL函数将被程序使用,以便在编译时就进行必要的处理。 在给定的压缩包中,有以下几个关键工具: 1. `implibren.exe`:这是一个用于修改导入库名的工具。当你...

    VC++动态链接库编程 dll编写教程

    2. 导入函数:使用`__declspec(dllimport)`关键字声明将要调用的DLL函数,使得编译器知道这些函数在DLL中。 3. 调用函数:如同调用本地函数一样,直接调用DLL中的函数。 四、DLL的链接方式 1. 静态链接:编译时将...

    C++源代码封装成dll动态链接库,并在WPF项目中使用的步骤说明

    为了避免这个问题,我们通常在函数声明时添加extern "C",这样可以使得C++编译器按照C语言的规则来修饰名字,或者使用相应的编译器指令。 创建完DLL后,我们需要编译源代码得到DLL文件(通常是一个.dll文件)和一个...

    详解C++ 动态库导出函数名乱码及解决

    根据 C++ 编译器的修饰规则,函数名会被修改,以便于在 DLL 中使用。在 C++ 中,有三种调用约定:__stdcall、__cdecl 和 __fastcall。每种调用约定都有其自己的修饰规则。 二、C++ 动态库导出函数名乱码的解决 要...

    如何将.exe改为.dll

    此时,如果你没有错误,你会发现在bin\Debug目录下生成了一个新的.dll文件,这意味着你的应用程序已经被成功地转换为DLL。 6. **设置调试环境**: 虽然现在你的代码已经以DLL的形式存在,但你可能还需要调试代码。...

    用VC++制作DLL教程

    - 函数声明:默认的`__cdecl`声明方式限制了DLL只能被C/C++调用。要使其他语言(如VB)能调用,需使用`WINAPI`声明函数,使其符合Windows API标准。 **提供头文件和库文件**: - 建议创建包含导出函数原型的`.h`...

    反编DLL工具

    在IT行业中,DLL(Dynamic Link Library)文件是Windows操作系统中的一种共享库,它包含可由多个程序同时使用的函数和资源。这些文件对于软件开发者来说非常重要,因为它们允许代码重用和模块化。然而,有时我们需要...

    多态的编译器实现原理

    2. **名字栏**:用于记录变量名或函数名。 3. **地址栏**:记录变量或函数的地址信息,这个地址是相对地址,对于成员变量来说则是相对于类实例的偏移量。加载后,操作系统会进行地址重定位。 #### 多态与虚函数表 ...

    用bcb制作的一个动态库例子

    这样,MyFunction函数就被导出了,可以在其他程序中通过`LoadLibrary`和`GetProcAddress`函数加载和调用。 4. **编译与链接**:完成函数编写后,需要编译并链接DLL项目。BCC编译器会生成一个`.dll`文件和对应的`....

    Moq.dll库 下载

    Moq.dll是一个流行的.NET框架,用于进行单元测试。它是一个模拟(Mocking)库,能够帮助开发者在测试代码时创建虚拟对象,以便于隔离被测试的代码片段,从而实现更有效的单元测试。Moq这个名字来源于“Mock Objects...

    lpk.rar_lpk_lpk 源码_lpk.dll_lpk/download_lpk源码

    【标题】"lpk.rar_lpk_lpk 源码_lpk.dll_lpk/download_lpk源码" 提供的是一个关于C语言编程的资源包,其中包含了一个名为`lpk.dll`的动态链接库(Dynamic Link Library)的源代码。这个`lpk.dll`可能是一个用于特定...

    PE输出表模块易语言源码

    它包含了导出函数的名字、序号、地址等信息,这对于动态链接库(DLL)尤其关键,因为它们主要通过输出表来提供服务给调用者。 易语言是一种以中文为编程语句的编程环境,它的设计理念是让编程更加直观、易于理解。...

    北邮:分布式实验一

    - **验证名字改编问题**:通过观察 BC 客户端是否能成功调用 VC 客户端的组件对象,来检测名字改编对跨编译器兼容性的影响。 - **验证 DLL 升级问题**:通过修改 `Animals` 类的头文件并观察客户端是否仍能正常...

    synmozjs52x32dlls.zip

    在使用"synmozjs52x32dlls"时,开发者必须确保目标系统上正确安装了兼容的Delphi运行时库,并且在调用DLL函数时遵循正确的命名约定和调用约定。 此外,DLL还涉及内存管理和线程安全。在多线程环境中,开发者需要...

    C++编写DLL动态链接库的步骤与实现方法

    注意,为了跨编译器兼容,有时还需要在函数前添加`extern "C"`来避免C++的名字修饰问题。 3. **模块定义文件(.def)** 当函数名需要保持原样时,可以创建一个`.def`文件,如`DLLTest.def`,其中定义导出函数的...

    掌讯互动面试题_嵌入式-常用知识&面试题库_大厂面试真题.doc

    :因为 C++ 编译器在编译 C 代码时需要将函数名改名,以避免与 C++ 函数名冲突。 八、动态库 1. 两个动态库 a.dll、b.dll,一个静态库 c.lib 和一个可执行文件 d.exe,a.dll、b.dll 包含 c.lib, d.exe包含两个动态...

    ILspy反编译器

    ILSpy是一款广受欢迎的开源反编译器,主要用于.NET框架下的程序代码查看和分析。它以其易用性和功能强大而闻名,是许多开发者在调试、学习或逆向工程.NET应用程序时的重要工具。ILSpy这个名字来源于中间语言...

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

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

    tm.rar_visual c

    在Windows系统中,DLL(动态链接库)文件是一种共享代码的方式,多个程序可以同时调用同一个DLL中的函数,以减少内存占用和提高效率。 在描述中提到“同来进行Internet时间同步的dll”,意味着“tm”可能是一个实现...

    C++ dlopen mini HOWTO

    为了解决这一问题,可以使用`extern "C"`来声明函数,告诉编译器不进行名称重整,从而使得C++函数能够像C函数一样被动态加载。 ```cpp extern "C" { void some_function(); } ``` - **函数的动态加载**: - ...

Global site tag (gtag.js) - Google Analytics