首先使用VS2010来导出一个DLL,该DLL种含有一个类,新建项目,如下图

然后看资源管理器,在DLL导出类中添加要导出的函数或者类

编辑要导出的类或者函数,如下:

编译后生成DLL,名字就是工程名 “ClassDll.dll”

然后新建一个工程,调用该dll,代码如下:

 

  1. #include<iostream>
  2. using namespace std;
  3. #include<Windows.h>
  4. typedef int(*MYPROC)(int,int);
  5. void main()
  6. {
  7.          MYPROC pFunc;
  8.     HMODULE hdll_lib=::LoadLibraryEx(TEXT(“ClassDll.dll”),NULL,0);
  9.     if(hdll_lib==NULL)
  10.     {
  11.         cout<<“call dll function error”<<endl;
  12.         FreeLibrary(hdll_lib);
  13.         return;
  14.     }
  15.     pFunc=(MYPROC)GetProcAddress(hdll_lib,”SubFunc”);
  16.     if(pFunc)
  17.     {
  18.         int a=pFunc(3,2);
  19.         cout<<“call dll successed! 3-2=”<<a<<endl;
  20.         FreeLibrary(hdll_lib);
  21.         return;
  22.     }
  23.     else
  24.     {
  25.         cout<<“pFunc error!”<<endl;
  26.     }
  27. }

 

当然,如果是给别人用的话,要提供给他一个头文件

extern “C”是导出标准的C程序代码

 

也许你并不满足于导出一个函数,你也许想导出一个类,这样更方便,下面来讲解怎么样导出一个类

第一步 还是一样的,创建工程,将要导出的类如下写

 

然后你需要的是给调用者提供一个头文件,非常简单如下

 

然后把ClassDll.dll和ClassDll.lib文件拷贝到工程目录下面,在main.cpp中加上这样一句预处理

#pragma comment(lib,”ClassDll.lib”)

 

lib文件时dll文件的入口导入文件

main函数如下

 

  1. #include<iostream>
  2. using namespace std;
  3. #include<Windows.h>
  4. #include”ClassDll.h”

  5. typedef int(*MYPROC)(int,int);

  6. #pragma comment(lib,”ClassDll.lib”)
  7. void main()
  8. {
  9.          MYPROC pFunc;
  10.     HMODULE hdll_lib=::LoadLibraryEx(TEXT(“ClassDll.dll”),NULL,0);
  11.     if(hdll_lib==NULL)
  12.     {
  13.         cout<<“call dll function error”<<endl;
  14.         FreeLibrary(hdll_lib);
  15.         return;
  16.     }
  17.     pFunc=(MYPROC)GetProcAddress(hdll_lib,”SubFunc”);
  18.     if(pFunc)
  19.     {
  20.         int a=pFunc(3,2);
  21.         cout<<“call dll successed! 3-2=”<<a<<endl;
  22.         FreeLibrary(hdll_lib);
  23.     }
  24.     else
  25.     {
  26.         cout<<“pFunc error!”<<endl;
  27.     }
  28.     DllClass dllClass;
  29.     int res=dllClass.AddFunction(2,3);
  30.     cout<<“调用导出类 2+3=”<<res<<endl;
  31. }

 

 

这是创建动态链接库的方法,创建静态链接库的方法是大同小异,省略。。。

 

下面说QT来创建和调用DLL或者静态链接库.a文件的方法,我想要比VS方便多了

创建导出类的DLL

第一步,创建工程

点击choose后,出现如下

然后看看它的.pro文件,如下

然后直接编辑类对应的.h和.cpp文件就OK了,我们创建导出类,叫MyShareLibrary,他有一个简单的函数,如下

编译就可以创建出dll,但是没有创建出来.lib文件,相反创建了一个.a文件,不过在QT里面调用dll方便的多,不用那么复杂,首先来调用一个导出的类

创建一个工程,在他的.pro工程文件中添加它所要调用的dll,如下

为他提供一个类的头文件,然后再要调用的地方如下调用

 

如果要在QT中调用一个导出的C函数呢,那么我们可以使用QLibrary类来完成,如下,我们来调用在VS中创建的导出C函数SubFunc(int,int)

 

  1. QLibrary library(“ClassDll”);
  2. if(!library.load())
  3.     return -1;
  4. typedef int(*pFunc)(int,int);
  5. pFunc function=(pFunc)library.resolve(“SubFunc”);
  6. if(function)
  7. {
  8.     res=function(4,3);
  9.     qDebug()<<“4-3=”<<res;
  10. }

 

 

如果要创建静态链接库,那么就在创建工程时候选择static library,他的工程文件有点不同

如下

划线那条是我最后加上去的,这样也可以同时生成dll文件,而当我们使用.a静态链接库的时候,就要在.pro文件中添加上它要链接的库文件,加上如下这句

 

 

好了,差不多写到这里!