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();

}


相关文章
|
1月前
|
开发框架 Linux C语言
C、C++、boost、Qt在嵌入式系统开发中的使用
C、C++、boost、Qt在嵌入式系统开发中的使用
45 1
|
2月前
|
安全 网络协议 数据安全/隐私保护
掌握Qt和C++:构建你的第一个P2P应用程序
掌握Qt和C++:构建你的第一个P2P应用程序
124 3
|
2月前
|
编译器 API C语言
深入探究Qt与C++标准的兼容之旅
深入探究Qt与C++标准的兼容之旅
84 3
|
2月前
|
存储 算法 API
【Qt 基本类】QDateTime类在C++中的应用与深度解析
【Qt 基本类】QDateTime类在C++中的应用与深度解析
46 0
|
2月前
|
设计模式 缓存 编译器
【C++ 元对象系统03】深入探索Qt反射:从原理到实践
【C++ 元对象系统03】深入探索Qt反射:从原理到实践
66 4
|
2月前
|
存储 网络协议 C语言
【C/C++ 串口编程 】深入探讨C/C++与Qt串口编程中的粘包现象及其解决策略
【C/C++ 串口编程 】深入探讨C/C++与Qt串口编程中的粘包现象及其解决策略
95 0
|
2月前
|
存储 传感器 安全
【串口通信】使用C++和Qt设计和实现串口协议解析器(二)
【串口通信】使用C++和Qt设计和实现串口协议解析器
82 0
|
2月前
|
存储 开发框架 算法
【串口通信】使用C++和Qt设计和实现串口协议解析器(一)
【串口通信】使用C++和Qt设计和实现串口协议解析器
210 0
|
2月前
|
编译器 API 数据安全/隐私保护
深入对比:Qt 的 QFile/QFileInfo 和与 C++17 Filesystem 和标准文件流 的细节剖析
深入对比:Qt 的 QFile/QFileInfo 和与 C++17 Filesystem 和标准文件流 的细节剖析
106 3
|
13天前
|
开发框架 编译器 C++
Qt:一个强大的跨平台C++应用程序开发框架
Qt:一个强大的跨平台C++应用程序开发框架
30 1