如何正确创建DLL和使用DLL


如何正确创建DLL和使用DLL



本文将通过一个简单的实例来说明,如何正确的导出DLL中的类、对象、函数,并如何通过静态加载或动态加载的方式来使用DLL。

一、DLL中导出类、函数、对象

  1. 创建一个空的Win32 Dynamic-Link Library项目Test

  2. 在项目中添加一个Test.h头文件,该文件的内容如下:
    如何正确创建DLL和使用DLL//导出类

    如何正确创建DLL和使用DLL
    class__declspec(dllexport) CTest

    如何正确创建DLL和使用DLL如何正确创建DLL和使用DLL
    {

    如何正确创建DLL和使用DLL...

    如何正确创建DLL和使用DLL}
    ;

    如何正确创建DLL和使用DLL

    如何正确创建DLL和使用DLL
    //导出函数

    如何正确创建DLL和使用DLL
    __declspec(dllexport)voidFuncTest();

    如何正确创建DLL和使用DLL

    如何正确创建DLL和使用DLL

    如何正确创建DLL和使用DLL
    //导出对象

    如何正确创建DLL和使用DLL
    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文件中复制过来。具体内容如下:
    如何正确创建DLL和使用DLL#pragmacomment(lib, "test.lib")

    如何正确创建DLL和使用DLL

    如何正确创建DLL和使用DLL
    //导入类

    如何正确创建DLL和使用DLL
    class__declspec(dllimport) CTest

    如何正确创建DLL和使用DLL如何正确创建DLL和使用DLL...
    {

    如何正确创建DLL和使用DLL...

    如何正确创建DLL和使用DLL}
    ;

    如何正确创建DLL和使用DLL

    如何正确创建DLL和使用DLL
    //导入函数

    如何正确创建DLL和使用DLL
    __declspec(dllimport)voidFuncTest();

    如何正确创建DLL和使用DLL

    如何正确创建DLL和使用DLL

    如何正确创建DLL和使用DLL
    //导入对象

    如何正确创建DLL和使用DLL
    extern__declspec(dllimport) CTest ObjTest;
    这个.h文件与dll的.h的不同就是,在开头加了#pragmacomment(lib, "test.lib"),以及类、函数、对象前面的__declspec(dllexport)变成了__declspec(dllimport) 。通过这些修改就可以告诉编译器,这个.h文件中定义的类、声明的函数和对象都是从test.dll中导入的。在项目中完成对这些类、函数、对象的调用代码后,就可以将其编译成可执行文件。将生成的可执行为文件、以及上面生成的.dll文件复制到同一个文件夹中就可以正常运行这个可执行文件。

三、动态加载DLL

如果上面的DLL需要被动态调用,这需在DLL的代码中添加一个 .def文件,在该文件中指出哪些被导出的函数和对象是可以动态调用的。根据上面的例子.def文件的内容如下:
如何正确创建DLL和使用DLLLIBRARY TestImp

如何正确创建DLL和使用DLL

如何正确创建DLL和使用DLLEXPORTS

如何正确创建DLL和使用DLL ObjTest
FuncTest

如何正确创建DLL和使用DLL

在完成.def文件后,重新编译dll。重新编译dll后就可以对该Dll进行动态调用了,调用过程的代码如下:
如何正确创建DLL和使用DLLtypedefvoid(*HFUNC)()

如何正确创建DLL和使用DLL

如何正确创建DLL和使用DLLHINSTANCE hDLL
=LoadLibrary("Test.dll");//加载DLL

如何正确创建DLL和使用DLL


如何正确创建DLL和使用DLL
if(hDLL)

如何正确创建DLL和使用DLL如何正确创建DLL和使用DLL
{

如何正确创建DLL和使用DLL HFUNC hFun
=(HFUNC)GetProcAddress(hDLL,"FuncTest");//获得Dll中FuncTest函数的指针。

如何正确创建DLL和使用DLL


如何正确创建DLL和使用DLL
if(hFun)

如何正确创建DLL和使用DLL hFun();
//执行函数FuncTest

如何正确创建DLL和使用DLL
else

如何正确创建DLL和使用DLL ...
//没有找到函数FuncTest

如何正确创建DLL和使用DLL
}


如何正确创建DLL和使用DLL
else

如何正确创建DLL和使用DLL如何正确创建DLL和使用DLL
{

如何正确创建DLL和使用DLL
//加载失败

如何正确创建DLL和使用DLL
}

上面的代码实现的对DLL中函数的动态调用,在代码中通过LoadLibrary将DLL加载到内存中,然后GetProcAddress获得指定函数所在的内存地址(即该函数的函数指针),获得指向这个函数的指针后就可以对它进行调用了。

对于DLL中对象的动态调用过程基本上是一样的,先将DLL加载到内存,然后通过GetProcAddress获得对象所在的地址。

从上面可以看出,DLL的动态调用过程就是将DLL加载到内存,然后通过GetProcAddress获得DLL中指定对象或函数在该内存中的地 址,通过该地址就可以对函数或对象进行调用。由于在C++中没有类的对象,也没有类指针一说,所以是无法动态使用DLL中的类的(如果谁知道如何使用可以 告诉我)。
原文链接: https://www.cnblogs.com/fence/archive/2010/05/27/1745019.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/11241

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 上午12:58
下一篇 2023年2月7日 上午12:59

相关推荐