专栏首页狂码一生Qt创建及使用动态链接库(一)

Qt创建及使用动态链接库(一)

先讲一下对QT动态链接库的调用方法,主要包括:

1、显式链接DLL,调用DLL的全局函数,采用Qt的QLibrary方法

2、显示链接DLL,调用DLL中类对象、成员函数。(通过对象即可实现类成员函数的调用)

①用虚函数表的方法,这也是COM使用的方法,利用Qt的QLibrary技术调用;

②用GetProcAddress直接调用。

③用Qt的QPluginLoader类直接调用生成的DLL插件类对象

3、隐式链接DLL:也是采用Qt的Qlibrary方法

本节教程主要讲的是第1种,下面开始:

一、新建DLL项目,这里直接上图

后面的一直过,直接新建完成 ,最后建成的项目如图所示(我写的教程部分截图是我已经写好的项目)

二、studydll_global.h中的文件不用动,下面直接贴出testdll.h和testdll.cpp代码

#ifndef TESTDLL_H
#define TESTDLL_H

#include "studydll_global.h"

class studydll_DLLSHARED_EXPORT testdll
{

public:
    testdll();

private:
};

extern "C" studydll_DLLSHARED_EXPORT void helloWorld();
extern "C" studydll_DLLSHARED_EXPORT int add(int a,int b);

#endif // TESTDLL_H
#include <iostream>
#include "testdll.h"

using namespace std;

testdll::testdll()
{

}

void helloWorld(){
    cout << "hello world!"<<endl;
}

int add(int a , int b){
    return a+b;
}

写好代码后直接点击编译,如果没有错误dll文件就已经成功了,在我们选择的运行方式目录下:

三、使用:我在这里新建了一个控制台程序作为调用示例,还是直接上代码

#include <QCoreApplication>
#include <iostream>
#include <QLibrary>
#include <QTextCodec>
#include <QString>

using namespace std;

//定义函数指针
typedef int (*Fun)(int,int);

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //设置编码

    QLibrary mylib("studydll.dll");
    int result;
    //判断是否正确加载了dll
    if(mylib.load()){
        cout<<"动态链接库加载成功"<<endl;
        //调用外部函数ADD
        Fun add = (Fun)mylib.resolve("add");
        //判断是否成功链接上add()函数
        if(add){
            cout<<"调用add函数成功"<<endl;
            //使用dll中的add函数
            result = add(11,23);
            cout<<"通过dll中的add函数计算出的结果:11+23="<<result<<endl;
        }else{
            cout<<"调用add函数失败"<<endl;
        }
    }else{ // 动态库加载失败
        cout<<"动态库dll加载失败 error"<<endl;
    }

    return a.exec();
}

最后测试的结果

到这里就完成了,dll在其它语言中或者平台中调用方法各不相同,可以自行在网上上搜索进行调用,这里介绍的是其中一种动态库生成与调用,后面的教程会出来没用使用到的其它方式。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CentOS-7安装成功后配置网络连接

    一、修改配置文件     vim /etc/sysconfig/network-scripts/ifcfg-ens33     将 ONBOOT=no 修改为...

    Sindsun
  • QT5中操作QWidgetItem下的集合元素(二)

    Sindsun
  • 为html页面设置图片加载失败时的默认图片

      利用error事件捕获来处理(全局判断,动态添加的元素也可以),最好将下面的js写在head部分

    Sindsun
  • CodeForces 954A Diagonal Walking

            题意是给一个长度为n的字符串,然后要缩短这个字符串,字符串中UR或者RU的长度可以缩为1,求最短长度。

    Ch_Zaqdt
  • vue的路由独享守卫

    用户4344670
  • 如何成为一个技术“牛人”

    1) 自信第一。自信这东西很是奇怪,人有可能一开始会莫明其妙的自信,但一切都从这开始的。你觉得自己行你就一定会变得行,反之,如果觉得自已不行,那一定会不行。

    Daotin
  • 编写一个javscript函数 fn,该函数有一个参数 n(数字类型),其返回值是一个数组,该数组内是 n 个随机且不重复的整数,且整数取值范围是 [2, 32]。

    windseek
  • WordPress侧边栏“博客统计”小工具

    神无月
  • iBatis for Net 代码生成器(CodeHelper)附下载地址(已经升级为V 1.1)

    CodeHelper是一款可以自己定义模板和生成内容的代码生成器,目前只支持MsSql数据库,这款代码生成器的初衷也只是为了生成MyBatis.net框架的配置...

    Java中文社群_老王
  • LNMP一键安装包

    LNMP一键安装包 V1.5 已经在Vultr、遨游主机、搬瓦工、LocVPS、Linode、vps2ez、DiaHosting、OneAsiaHost、Dig...

    凯哥Java

扫码关注云+社区

领取腾讯云代金券