如何正确创建DLL和使用DLL
如何正确创建DLL和使用DLL
本文将通过一个简单的实例来说明,如何正确的导出DLL中的类、对象、函数,并如何通过静态加载或动态加载的方式来使用DLL。
一、DLL中导出类、函数、对象
1. 创建一个空的Win32 Dynamic-Link Library项目Test
2. 在项目中添加一个Test.h头文件,该文件的内容如下:
class __declspec(dllexport) CTest
{
...
};
//导出函数
__declspec(dllexport) void FuncTest();
//导出对象
extern __declspec(dllexport) CTest ObjTest;
这段代码中通过__declspec(dllexport)导出了类CTest、函数FuncTest和对象ObjTest。在.cpp文件中实现上面的声明与类的定义后,经编译就可以生成一个.dll和.lib文件了。
二、静态加载DLL
1. 新建一个Win32 项目。
2. 将上面编译生成的.lib文件复制到,该项目下。
3. 在项目中添加一个Test.h(通过该文件实现对DLL的静态加载),该.h文件的内容主要是从DLL的.h文件中复制过来。具体内容如下:
//导入类
class __declspec(dllimport) CTest
...{
...
};
//导入函数
__declspec(dllimport) void FuncTest();
//导入对象
extern __declspec(dllimport) CTest ObjTest;
这个.h文件与dll的.h的不同就是,在开头加了#pragma comment(lib, "test.lib"),以及类、函数、对象前面的__declspec(dllexport)变成了__declspec(dllimport) 。通过这些修改就可以告诉编译器,这个.h文件中定义的类、声明的函数和对象 都是从test.dll中导入的。在项目中完成对这些类、函数、对象的调用代码后,就可以将其编译成可执行文件。将生成的可执行为文件、以及上面生成的.dll文件复制到同一个文件夹中就可以正常运行这个可执行文件。
三、动态加载DLL
如果上面的DLL需要被动态调用,这需在DLL的代码中添加一个 .def文件,在该文件中指出哪些被导出的函数和对象是可以动态调用的。根据上面的例子.def文件的内容如下:
EXPORTS
ObjTest
在完成.def文件后,重新编译dll。重新编译dll后就可以对该Dll进行动态调用了,调用过程的代码如下:
HINSTANCE hDLL = LoadLibrary("Test.dll"); //加载DLL
if(hDLL)
{
HFUNC hFun = (HFUNC)GetProcAddress(hDLL, "FuncTest"); //获得Dll中FuncTest函数的指针。
if (hFun)
hFun(); //执行函数FuncTest
else
... //没有找到函数FuncTest
}
else
{
//加载失败
}
上面的代码实现的对DLL中函数的动态调用,在代码中通过LoadLibrary将DLL加载到内存中,然后GetProcAddress获得指定函数所在的内存地址(即该函数的函数指针),获得指向这个函数的指针后就可以对它进行调用了。
对于DLL中对象的动态调用过程基本上是一样的,先将DLL加载到内存,然后通过GetProcAddress获得对象所在的地址。
从上面可以看出,DLL的动态调用过程就是将DLL加载到内存,然后通过GetProcAddress获得DLL中指定对象或函数在该内存中的地 址,通过该地址就可以对函数或对象进行调用。由于在C++中没有类的对象,也没有类指针一说,所以是无法动态使用DLL中的类的(如果谁知道如何使用可以 告诉我)。
转载于:https://www.cnblogs.com/fence/archive/2010/05/27/1745019.html
如何正确创建DLL和使用DLL相关推荐
- wxWidgets:创建应用程序的 DLL
wxWidgets:创建应用程序的 DLL wxWidgets:创建应用程序的 DLL 问题 创建一个 wxWidgets DLL 应用程序,支持 GUI 头文件:wxWidgetsDLL.h 源文件 ...
- VC++6.0如何创建与调用动态链接库(dll)
VC++支持的DLL: DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库.MFC规则DLL和MFC扩展DLL.DLL导出函数(或变量.类)可供应用程 ...
- windows中dllmain,创建进程和转发dll
dllmain dll模块的函数入口 BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved ...
- 缺少d3dx9_xx.dll/缺少PhysXLoader.dll/配置不正确等常见问题解决方法
缺少d3dx9_xx.dll/缺少PhysXLoader.dll/配置不正确等常见问题解决方法 http://www.gamersky.com 2010-7-10 16:11:14 来源:游民星空 作 ...
- vs2010 导出创建dll 导入使用dll 导出有命名空间的类 函数 外部函数
2. #include "targetver.h" // dlltest.cpp : 定义 DLL 应用程序的导出函数. //#include "stdafx.h&quo ...
- c语言中ntdll.dll,c – ntdll.dll [下面的框架可能不正确/缺失,没有为ntdll.dll加载符号]...
几个星期以来,我遇到了这种情况,非常令人沮丧, 我的程序调试非常好,没有错误,当我运行程序时,它执行的初始部分 作业,几秒后它终止到'break continue'选项,并在调用堆栈中看一看,结果证明 ...
- Win32 DLL和MFC DLL 中封装对话框
Win32 DLL和MFC DLL 中封装对话框 分类: 挂挂2007-07-02 12:36 3344人阅读 评论(1) 收藏 举报 现在最常看见的关于DLL的问题就是如何在DLL中使用对话框,这是 ...
- Unity3D之Android加密DLL与破解DLL
转自:http://blog.csdn.net/yupu56/article/details/53216705 1.加密方案 Unity 3D项目游戏逻辑采用C#脚本,我们知道C#编译生成的DLL或E ...
- DLL与MFC DLL
比较大的应用程序都是由很多模块组成的,这些模块彼此协作,以完成整个软件系统的工作.其中可能存在一些模块的功能较为通用,在构造其他软件系统时仍会被使用.在构造软件系统时,如果将所有模块的源代码都静态编译 ...
最新文章
- 恢复Cisco3640的IOS
- golang 编译提示 cannot assign interface {} 和golang断言使用
- include 路由 php,PHP简单路由
- java cron表达式_Java 程序员都应该去使用一下这款强大的国产工具类库
- Design a high performance cache for multi-threaded environment
- 计算机全加器简单实现
- 人人开源 VUE项目报错./src/assets/scss/index.scssModule build failed: Error: ENOENT: no such file or direct
- MyEclipse导入项目后 js文件报错
- 链路状态路由选择LS
- Android基站定位源代码
- j2sdk_5_0.exe的使用
- 十九个国内外主流的三维GIS
- 玩转MongoDB4.0(MongoDB基础总结)
- mysql 参数 1_警告:mysql_result()期望参数1为资源,给定布尔值[重复]
- linux下kbhit的头文件,linux下kbhit()使用
- epson喷墨一体机打印照片偏色的调整
- php获取实时汇率,php获取sinajs股票/汇率/期货实时价格
- Azure Synapse Analytics(Azure SQL DW) 性能优化指南(2)——使用具体化视图优化性能(上)
- 使用PS去水印的方法
- Spring AOP 切面记录操作日志