• 网站建设如何正确创建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中的类的(如果谁知道如何使用可以 告诉我)。
添加时间:2013-09-11 点击次数:57

麦谷公益   |   律师声明   |   商务合作   |   联系我们   |   网站地图   |   网站百科

Copyright © 2003 - 2011 Meganet. All Rights Reserved 鲁ICP备09105359号

艾默生UPS电源 艾默生UPS官网 艾默生空调官网 艾默生空调 艾默生精密空调 精密空调网 山特UPS电源 艾默生UPS电源
癫痫病 北京癫痫医院 北京癫痫病医院 癫痫病能治愈吗 癫痫病可以治愈吗 癫痫病的早期症状 癫痫病的早期症状 癫痫病的最新治疗方法 癫痫病人不能吃什么 癫痫病是怎么引起的 北京肾病医院 肾病医院排名 肾病的早期症状 北京肾病医院哪家好 肾病医院 西安康杰癫痫病医院 癫痫病能治愈吗 癫痫病是怎么引起的 北京癫痫病医院 癫痫病的最新治疗方法