Qt调用VC++生成的动态链接库

简介: Qt调用VC++生成的动态链接库

Qt如何调用VC++生成的动态链接库?假设当前有VC++编译器生成的动态库文件testdll.h,testdll.lib和testdll.dll。


testdll.h文件源码如下:


#ifdef TESTDLL_EXPORTS

#define TESTDLL_API __declspec(dllexport)

#else

#define TESTDLL_API __declspec(dllimport)

#endif

// 此类是从 testdll.dll 导出的

class TESTDLL_API Ctestdll {

public:

Ctestdll(void);

public:

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

int Sub(int a, int b) {return a-b;}

int Mul(int a, int b) {return a*b;}

};

extern TESTDLL_API int ntestdll;

TESTDLL_API int fntestdll(void);




Qt如何使用这些动态链接库文件?


一、情况1,编程环境是Qt Creator+Qt libraries 4.8.6 for Windows (VS 2010)


Qt库是VS2010版本,VC++编译器生成的。所以工程可以直接使用testdll.h头文件和testdll.lib引入库文件。


1、把testdll.h拷贝到工程路径;


2、工程文件XXX.pro需要手动添加"HEADERS += testdll.h"和"LIBS += testdll.lib";


3、编译前,需要把lib文件:testdll.lib和testdll.dll一起拷贝到构建路径下面。


如此便可以正常使用VC++动态链接库函数。




二、情况2,编程环境是Qt Creator+Qt libraries 4.8.6 for Windows (MinGW 4.8.2)


Qt库是MinGW版本,gcc编译器生成,与VC++编译器不是同个体系。所以工程不可以使用testdll.h头文件和testdll.lib引入库文件。


对于调用DLL的方法,Qt本身就有相应的类来实现。


#include "dialog.h"

#include <QApplication>

#include <QLibrary>


typedef int (*func_Add)(int a, int b); //定义函数指针

typedef int (*func_Sub)(int a, int b);

typedef int (*func_Mul)(int a, int b);


int main(int argc, char *argv[])

{

   QApplication a(argc, argv);


   QLibrary mylib("testdll.dll");//testdll.dll的存放路径与.exe一致

   if (mylib.load())

   {

       //"?Add@Ctestdll@@QAEHHH@Z"等字符串其实就是动态库函数int Add(int a, int b)的变体,请使用微软工具DEPENDS.EXE查看得到

       func_Add f1 = (func_Add)mylib.resolve("?Add@Ctestdll@@QAEHHH@Z");

       func_Sub f2 = (func_Sub)mylib.resolve("?Sub@Ctestdll@@QAEHHH@Z");

       func_Mul f3 = (func_Mul)mylib.resolve("?Mul@Ctestdll@@QAEHHH@Z");

       int rt = 0;


       if (f1 != NULL)

       {

           rt = f1(10, 12);

       }


       if (f2 != NULL)

       {

           rt = f2(10, 12);

       }


       if (f3 != NULL)

       {

           rt = f3(10, 12);

       }

   }


   Dialog w;

   w.show();


   return a.exec();

}


相关文章
|
5月前
|
前端开发 数据库 数据安全/隐私保护
搭建互联网医院系统:医疗资质对接与合规建设解析
互联网医院开发难点不在界面,而在资质合规、多系统对接(HIS/EMR/医保/处方平台)与数据安全。需构建可审计的日志体系、智能接口中台及全流程加密机制,实现医疗协同而非简单线上问诊。
|
存储 API 数据安全/隐私保护
企业级Docker镜像仓库Harbor部署与使用
企业级Docker镜像仓库Harbor部署与使用
1068 1
|
运维 程序员 项目管理
一份【软件工程】的学习指南已到达,请注意查收!!
该文章提供了一份软件工程的学习指南,包括学习软件工程的重要性、基本内容概览以及建议的学习方法和路径。
一份【软件工程】的学习指南已到达,请注意查收!!
|
Web App开发 JavaScript 前端开发
深入探索 Playwright:高级功能和用法
【2月更文挑战第6天】
899 1
|
SQL Java 数据库连接
MyBatis插件深度解析:功能、原理、使用、应用场景与最佳实践
MyBatis插件深度解析:功能、原理、使用、应用场景与最佳实践
|
自然语言处理 算法 数据库
OpenSearch向量检索和大模型方案深度解读
深度解读开放搜索在向量检索和大模型方面的升级演进。
82325 7
|
Linux PHP 开发工具
Phpstorm环境配置与应用
Phpstorm环境配置与应用
|
JavaScript 前端开发 应用服务中间件
通过域名的方式访问服务器里的资源
通过域名的方式访问服务器里的资源
|
缓存 网络协议 网络安全
SRv6在SFC中的应用
【2月更文挑战第28天】SFC(Service Function Chaining)是指一系列业务功能(如DPI、FW、IPS、WAF)按序处理特定业务流的网络架构。它包括SF(服务功能节点)、SFF(转发器)、SFP(转发路径)和Classifier(流分类器)等组件。SRv6作为支持SFC的技术,有两种方案:无状态Stateless SRv6 SFC,通过SID组合实现路径编程,不需要维护转发状态;有状态Stateful SRv6 SFC,结合SRv6和NSH,适用于SF不支持SRv6的情况。
|
存储 安全 API
阿里云APP下载入口和方式
阿里云APP是一款为用户提供安全、稳定、高效的云计算服务的手机应用程序。它具备多种功能,包括文件存储、文件共享、远程控制、备份等等。下面从背景介绍、概览、价值、竞品对比分析、可靠性、创新性、用户反馈和影响力等方面展开扩写。
阿里云APP下载入口和方式