• 简单建立DLL和使用DLL


    首先,这个只是最简单的一个说明而已,拿VS来说,有些特许的DLL就不是下面的方法生成和使用的,比如COM。

    一.DLL中导出类,对象,方法

    1. 创建一个空的Win32 Dynamic-Link Library项目Tes
    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中指定对象或函数在该内存中的地址,通过该地址就可以对函数或对象进行调用。

  • 相关阅读:
    DELL、HP、IBM X86服务器命名规则
    容灾,热备,集群等区别
    HDS(日立)AMS2000系列存储管理配置方法
    KBMMW 4.90.00 发布
    delphi 10 seattle 安卓服务开发(三)
    delphi 10 seattle 安卓服务开发(二)
    delphi 10 seattle 中 解决IOS 9 限制使用HTTP 服务问题
    Android 中的 Service 全面总结(转载)
    KBMMW 4.84.00 发布
    delphi 10 seattle 安卓服务开发(一)
  • 原文地址:https://www.cnblogs.com/BIGFOOT/p/1355101.html
Copyright © 2020-2023  润新知