您的位置:首页 > 编程语言 > Qt开发

QT链接库中类的导出,以及使用

2011-11-30 11:55 295 查看
主体思路如下:我们的动态链接库建立一个基类,里面的函数全部是纯虚函数,之后再建立一个子类继承基类,实现里面的函数,最后导出一个函数,这个函数返回一个子类的对象但是却被强制转换为基类的基类指针。然后在应用程序中也对应建立一个基类,之后调用导出的函数,就可以使用子类实现的哪些功能了。动态链接库的建立myclass_lib.h#ifndef MYCLASS_LIB_H
#define MYCLASS_LIB_H
#include <windef.h>
class baseClass                                       //基类,全部是纯虚函数,也即导出的接口
{
public:
virtual int add(int, int) = 0;
virtual int sub(int, int) = 0;
};
class sonClass : public baseClass                     // 子类,实现虚函数
{
public:
int add(int, int);
int sub(int, int);
};
extern "C" _declspec(dllexport) baseClass* Create();    //这个函数用来返回一个指向子类但返回值为父类的指针
#endif // MYCLASS_LIB_H
myclass_lib.cpp#include "myclass_lib.h"
baseClass* Create()
{
return (baseClass *) new sonClass;          //强制转换为父类
}
int sonClass::add(int x, int y)                 //函数的实现
{
return x + y;
}
int sonClass::sub(int x, int y)
{
return x - y;
}
之后编译就可以生成我们需要的myclass_lib.dll了,之后就是dll的引用了。
我在DEVCPP环境下新建一个.cpp文件,代码如下:
my_lib_class.cpp
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <windef.h>
class baseClass             //同样的基类
{
public:
virtual int add(int, int) = 0;     
virtual int sub(int, int) = 0;       
};
int main()
{    
baseClass *test;            // 新建一个父类指针
int flag = 0;
typedef baseClass* (*Create)();    //定义一个函数吧,,和dll中的对应
HINSTANCE hdll = NULL;             //Windows的句柄什么的吧
hdll = LoadLibrary("myclass_lib.dll");  //加载动态链接库
if(hdll == NULL)
    {  
printf("Load library error!\n");
system("pause");
return 1;
}
Create create;
create = (Create)GetProcAddress(hdll, "Create"); //取得函数地址
if(create == NULL)
    {   
printf("GetProcAddress error!\n");
system("pause");
return 1;
}
test = create();                                 //test为create()返回的一个父类的指针
printf("3 + 2 = %d \n", test->add(3, 2));        //函数调用
printf("3 - 2 = %d \n", test->sub(3, 2));
flag = FreeLibrary(hdll);                //释放链接库
if(flag == 0)
   {   
printf("Free library error!\n");
      system("pause"); 
      return 1; 
}
system("pause");
return 0;
}
把dll复制到该文件目录下,编译运行,结果如下图:调用成功。附:不知道认真的阅者有没有发现这个程序的一个问题,就是dll new了一个子类的对象都没有释放,这个问题还没有具体找出想法,还望大家指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: