如何正确创建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文件中复制过来。具体内容如下:

#pragma comment(lib, "test.lib")

//导入类
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文件的内容如下:

LIBRARY    TestImp

EXPORTS
    ObjTest
        FuncTest

在完成.def文件后,重新编译dll。重新编译dll后就可以对该Dll进行动态调用了,调用过程的代码如下:

typedef void (*HFUNC)()

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相关推荐

  1. wxWidgets:创建应用程序的 DLL

    wxWidgets:创建应用程序的 DLL wxWidgets:创建应用程序的 DLL 问题 创建一个 wxWidgets DLL 应用程序,支持 GUI 头文件:wxWidgetsDLL.h 源文件 ...

  2. VC++6.0如何创建与调用动态链接库(dll)

    VC++支持的DLL: DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库.MFC规则DLL和MFC扩展DLL.DLL导出函数(或变量.类)可供应用程 ...

  3. windows中dllmain,创建进程和转发dll

    dllmain dll模块的函数入口 BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved ...

  4. 缺少d3dx9_xx.dll/缺少PhysXLoader.dll/配置不正确等常见问题解决方法

    缺少d3dx9_xx.dll/缺少PhysXLoader.dll/配置不正确等常见问题解决方法 http://www.gamersky.com 2010-7-10 16:11:14 来源:游民星空 作 ...

  5. vs2010 导出创建dll 导入使用dll 导出有命名空间的类 函数 外部函数

    2. #include "targetver.h" // dlltest.cpp : 定义 DLL 应用程序的导出函数. //#include "stdafx.h&quo ...

  6. c语言中ntdll.dll,c – ntdll.dll [下面的框架可能不正确/缺失,没有为ntdll.dll加载符号]...

    几个星期以来,我遇到了这种情况,非常令人沮丧, 我的程序调试非常好,没有错误,当我运行程序时,它执行的初始部分 作业,几秒后它终止到'break continue'选项,并在调用堆栈中看一看,结果证明 ...

  7. Win32 DLL和MFC DLL 中封装对话框

    Win32 DLL和MFC DLL 中封装对话框 分类: 挂挂2007-07-02 12:36 3344人阅读 评论(1) 收藏 举报 现在最常看见的关于DLL的问题就是如何在DLL中使用对话框,这是 ...

  8. Unity3D之Android加密DLL与破解DLL

    转自:http://blog.csdn.net/yupu56/article/details/53216705 1.加密方案 Unity 3D项目游戏逻辑采用C#脚本,我们知道C#编译生成的DLL或E ...

  9. DLL与MFC DLL

    比较大的应用程序都是由很多模块组成的,这些模块彼此协作,以完成整个软件系统的工作.其中可能存在一些模块的功能较为通用,在构造其他软件系统时仍会被使用.在构造软件系统时,如果将所有模块的源代码都静态编译 ...

最新文章

  1. 恢复Cisco3640的IOS
  2. golang 编译提示 cannot assign interface {} 和golang断言使用
  3. include 路由 php,PHP简单路由
  4. java cron表达式_Java 程序员都应该去使用一下这款强大的国产工具类库
  5. Design a high performance cache for multi-threaded environment
  6. 计算机全加器简单实现
  7. 人人开源 VUE项目报错./src/assets/scss/index.scssModule build failed: Error: ENOENT: no such file or direct
  8. MyEclipse导入项目后 js文件报错
  9. 链路状态路由选择LS
  10. Android基站定位源代码
  11. j2sdk_5_0.exe的使用
  12. 十九个国内外主流的三维GIS
  13. 玩转MongoDB4.0(MongoDB基础总结)
  14. mysql 参数 1_警告:mysql_result()期望参数1为资源,给定布尔值[重复]
  15. linux下kbhit的头文件,linux下kbhit()使用
  16. epson喷墨一体机打印照片偏色的调整
  17. php获取实时汇率,php获取sinajs股票/汇率/期货实时价格
  18. Azure Synapse Analytics(Azure SQL DW) 性能优化指南(2)——使用具体化视图优化性能(上)
  19. 使用PS去水印的方法
  20. Spring AOP 切面记录操作日志

热门文章

  1. 『ACM-算法-离散化』信息竞赛进阶指南--离散化
  2. 洛谷P3360偷天换日(树形DP)
  3. [机器学习] XGB/LGB---自定义损失函数与评价函数
  4. [机器学习] PMML实现模型上线
  5. 外设位宽为8、16、32时,CPU与外设之间地址线的连接方法
  6. Struts2和Struts1.x的全面比较
  7. 深度学习领域专业词汇_深度学习时代的人文领域专业知识
  8. 谈谈 Android 中的 PathClassLoader 和 DexClassLoader
  9. 为什么支付宝不提供房贷业务?原因在这里
  10. 藉上帝之旨,行时代之命的文学长征