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_Hmyclass_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了一个子类的对象都没有释放,这个问题还没有具体找出想法,还望大家指教。
相关文章推荐
- QT链接库中类的导出,以及使用
- Qt添加自定义控件并在qtDesigner中使用以及链接失败的解决方法
- 使用def文件从dll导出和_declspec(dllexport)导出区别以及调用示例
- Qt简介以及如何配置Qt使用VS2010进行开发
- ubuntu, windows下安装opencv, 以及在qt,vs2010,dev,codeblock中的使用
- 关于Qt的事件循环以及QEventLoop的简单使用
- Java使用jdbc链接数据库的MySQL 5.5.45+以及SSL错误解决办法
- QT下使用MapX控件的问题以及Activex技术
- putty和Xshell的远程链接以及秘钥使用
- Qt+VC环境搭建以及使用方法
- [highCharts入门]去除图表链接以及print download(导出,下载)
- mongodb使用场景分析 以及一些mongodb参考链接
- 财富500强的前10个公司里有8个公司在使用Qt(Qt自己认为的优点是:直觉主义、跨平台、节省时间),以及一些商业案例
- python爬虫初级--获取指定页面上的菜单名称以及链接,然后导出
- 如何使用plsql导出oracle数据建表语句,存储过程,视图。以及表中数据
- Qt简介以及如何配置Qt使用VS2010进行开发
- QT 4.7.0 使用odbc链接sqlserver 测试成功
- Qt简介以及如何配置Qt使用VS2010进行开发
- 7-干货! QT -实现使用拖放打开文件,以及打开可拖动的图片
- cocos2dx中Http链接以及使用JsonCPP解析的简单函数