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

本文详细介绍了如何创建并应用动态链接库,包括库的结构设计、函数接口定义、子类实现及调用过程。重点阐述了如何通过DLL生成和引用实现功能模块的复用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主体思路如下:
      我们的动态链接库建立一个基类,里面的函数全部是纯虚函数,之后再建立一个子类继承基类,实现里面的函数,最后导出一个函数,这个函数返回一个子类的对象但是却被强制转换为基类的基类指针。然后在应用程序中也对应建立一个基类,之后调用导出的函数,就可以使用子类实现的哪些功能了。

动态链接库的建立
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复制到该文件目录下,编译运行,结果如下图:
QT链接库中类的导出,以及使用 - vanpire110 - vanpire110的博客
 
调用成功。



附:
不知道认真的阅者有没有发现这个程序的一个问题,就是dll new了一个子类的对象都没有释放,这个问题还没有具体找出想法,还望大家指教。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值