-
#include"stdafx.h"
-
#include"windows.h"
-
typedefint(CALLBACK*LPFNDLLFUNC)(void);
-
int_tmain(intargc,_TCHAR*argv[])
- {
-
HMODULEhDll;
-
hDll=LoadLibrary(L"Win32dllFirst");
- LPFNDLLFUNCfnTestDLLFun;
-
if(hDll!=NULL)
- {
-
fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"fnWin32dllFirst");
-
if(fnTestDLLFun!=NULL)
- {
-
intresult=fnTestDLLFun();
-
printf("%d",result);
- }
-
else
- {
-
printf("%d",GetLastError());
- }
- }
- FreeLibrary(hDll);
-
return0;
- }
基于上上一篇日志《dll编程学习日志》中的例子代码,我试图学习怎么限定dll输出函数命名。
现在贴出部分代码:
Win32dllFirst.h
-
classWIN32DLLFIRST_APICWin32dllFirst{
-
public:
-
CWin32dllFirst(void);
-
- };
-
externWIN32DLLFIRST_APIintnWin32dllFirst;
-
WIN32DLLFIRST_APIintfnWin32dllFirst(void);
生成之,拷贝到Win21dllFirstTest目录下。
Win21dllFirstTest.cpp
-
-
-
#include"stdafx.h"
-
#include"windows.h"
-
typedefint(CALLBACK*LPFNDLLFUNC)(void);
-
int_tmain(intargc,_TCHAR*argv[])
- {
-
HMODULEhDll;
-
hDll=LoadLibrary(L"Win32dllFirst");
- LPFNDLLFUNCfnTestDLLFun;
-
if(hDll!=NULL)
- {
-
fnTestDLLFun=(LPFNDLLFUNC)GetProcAddress(hDll,"?fnWin32dllFirst@@YAHXZ");
-
if(fnTestDLLFun!=NULL)
- {
-
intresult=fnTestDLLFun();
-
printf("%d",result);
- }
-
else
- {
-
printf("%d",GetLastError());
- }
- }
- FreeLibrary(hDll);
-
return0;
- }
看着这个"?fnWin32dllFirst@@YAHXZ"名字很讨厌啊。kill之。上网搜搜方案。
网上主要谈的就是extern "C",好的我就尝试,将Win32dllFirst.h代码改为:
-
classWIN32DLLFIRST_APICWin32dllFirst{
-
public:
-
CWin32dllFirst(void);
-
- };
-
extern"C"WIN32DLLFIRST_APIintnWin32dllFirst;
-
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"。就会抱错,那么关于类的限定名怎么设置呢?继续探索。
分享到:
相关推荐
生成静态导入库(.lib)的主要目的是让编译器知道哪些DLL函数将被程序使用,以便在编译时就进行必要的处理。 在给定的压缩包中,有以下几个关键工具: 1. `implibren.exe`:这是一个用于修改导入库名的工具。当你...
2. 导入函数:使用`__declspec(dllimport)`关键字声明将要调用的DLL函数,使得编译器知道这些函数在DLL中。 3. 调用函数:如同调用本地函数一样,直接调用DLL中的函数。 四、DLL的链接方式 1. 静态链接:编译时将...
为了避免这个问题,我们通常在函数声明时添加extern "C",这样可以使得C++编译器按照C语言的规则来修饰名字,或者使用相应的编译器指令。 创建完DLL后,我们需要编译源代码得到DLL文件(通常是一个.dll文件)和一个...
根据 C++ 编译器的修饰规则,函数名会被修改,以便于在 DLL 中使用。在 C++ 中,有三种调用约定:__stdcall、__cdecl 和 __fastcall。每种调用约定都有其自己的修饰规则。 二、C++ 动态库导出函数名乱码的解决 要...
此时,如果你没有错误,你会发现在bin\Debug目录下生成了一个新的.dll文件,这意味着你的应用程序已经被成功地转换为DLL。 6. **设置调试环境**: 虽然现在你的代码已经以DLL的形式存在,但你可能还需要调试代码。...
- 函数声明:默认的`__cdecl`声明方式限制了DLL只能被C/C++调用。要使其他语言(如VB)能调用,需使用`WINAPI`声明函数,使其符合Windows API标准。 **提供头文件和库文件**: - 建议创建包含导出函数原型的`.h`...
在IT行业中,DLL(Dynamic Link Library)文件是Windows操作系统中的一种共享库,它包含可由多个程序同时使用的函数和资源。这些文件对于软件开发者来说非常重要,因为它们允许代码重用和模块化。然而,有时我们需要...
2. **名字栏**:用于记录变量名或函数名。 3. **地址栏**:记录变量或函数的地址信息,这个地址是相对地址,对于成员变量来说则是相对于类实例的偏移量。加载后,操作系统会进行地址重定位。 #### 多态与虚函数表 ...
这样,MyFunction函数就被导出了,可以在其他程序中通过`LoadLibrary`和`GetProcAddress`函数加载和调用。 4. **编译与链接**:完成函数编写后,需要编译并链接DLL项目。BCC编译器会生成一个`.dll`文件和对应的`....
Moq.dll是一个流行的.NET框架,用于进行单元测试。它是一个模拟(Mocking)库,能够帮助开发者在测试代码时创建虚拟对象,以便于隔离被测试的代码片段,从而实现更有效的单元测试。Moq这个名字来源于“Mock Objects...
【标题】"lpk.rar_lpk_lpk 源码_lpk.dll_lpk/download_lpk源码" 提供的是一个关于C语言编程的资源包,其中包含了一个名为`lpk.dll`的动态链接库(Dynamic Link Library)的源代码。这个`lpk.dll`可能是一个用于特定...
它包含了导出函数的名字、序号、地址等信息,这对于动态链接库(DLL)尤其关键,因为它们主要通过输出表来提供服务给调用者。 易语言是一种以中文为编程语句的编程环境,它的设计理念是让编程更加直观、易于理解。...
- **验证名字改编问题**:通过观察 BC 客户端是否能成功调用 VC 客户端的组件对象,来检测名字改编对跨编译器兼容性的影响。 - **验证 DLL 升级问题**:通过修改 `Animals` 类的头文件并观察客户端是否仍能正常...
在使用"synmozjs52x32dlls"时,开发者必须确保目标系统上正确安装了兼容的Delphi运行时库,并且在调用DLL函数时遵循正确的命名约定和调用约定。 此外,DLL还涉及内存管理和线程安全。在多线程环境中,开发者需要...
注意,为了跨编译器兼容,有时还需要在函数前添加`extern "C"`来避免C++的名字修饰问题。 3. **模块定义文件(.def)** 当函数名需要保持原样时,可以创建一个`.def`文件,如`DLLTest.def`,其中定义导出函数的...
:因为 C++ 编译器在编译 C 代码时需要将函数名改名,以避免与 C++ 函数名冲突。 八、动态库 1. 两个动态库 a.dll、b.dll,一个静态库 c.lib 和一个可执行文件 d.exe,a.dll、b.dll 包含 c.lib, d.exe包含两个动态...
ILSpy是一款广受欢迎的开源反编译器,主要用于.NET框架下的程序代码查看和分析。它以其易用性和功能强大而闻名,是许多开发者在调试、学习或逆向工程.NET应用程序时的重要工具。ILSpy这个名字来源于中间语言...
DLL载入后,模块可以通过调用GetProcAddress获取DLL函数的 出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了 。 27.IP组播有那些好处? 答:Internet上产生的许多新的应用,特别是高...
在Windows系统中,DLL(动态链接库)文件是一种共享代码的方式,多个程序可以同时调用同一个DLL中的函数,以减少内存占用和提高效率。 在描述中提到“同来进行Internet时间同步的dll”,意味着“tm”可能是一个实现...
为了解决这一问题,可以使用`extern "C"`来声明函数,告诉编译器不进行名称重整,从而使得C++函数能够像C函数一样被动态加载。 ```cpp extern "C" { void some_function(); } ``` - **函数的动态加载**: - ...