QT调用C++写的Dll
C#寫的dll是沒有dllMain入口函數(shù)的,是一種中間語言,需要.Net運(yùn)行時(shí)進(jìn)行做本地化工作,因此如果要調(diào)用C#寫的dll,需要依賴.Net運(yùn)行時(shí),然而Qt中還無法直接調(diào)用.Net運(yùn)行時(shí),最好的方式是能夠在Qt中直接調(diào)用C#dll的函數(shù),但是Qt明顯只能調(diào)用C++寫的dll,所以就只能通過編寫一個(gè)C++的dll導(dǎo)出接口供Qt調(diào)用,這個(gè)C++編寫的dll對C#寫的dll進(jìn)行封裝,這個(gè)C++的dll可以采用/CLR方式對C#編寫的dll進(jìn)行引用的,即將C++編寫的dll中生成的.lib文件供Qt進(jìn)行鏈接,由于該接口符合C++規(guī)范,所以Qt可以鏈接到對應(yīng)的C++編寫的dll。
---------------------
編譯環(huán)境為:VS2010
C++?中要加 extern "C"才行,不然生成后的DLL使用DLL查看器可以發(fā)現(xiàn)函數(shù)名前會(huì)是“int __cdecl api_add(int,int)”這種樣子,無法使用。
加了??extern "C"?后再編譯發(fā)現(xiàn)是標(biāo)準(zhǔn)的C DLL庫了。
// CppDll.h
#pragma once
using namespace System::Reflection;
using namespace System;
extern "C" __declspec(dllexport) int api_add(int a, int b)
{
CSharpDll::CSharpClass obj;
return obj.add(a, b);
}
extern "C" __declspec(dllexport) void api_showBox(const char* content)
{
CSharpDll::CSharpClass obj;
String^ str = gcnew String(content);
obj.showBox(str);
}
--------------
其他相同
QT引用方式,三種
第一種、引用lib文件進(jìn)行編譯
1、pro文件加
LIBS += -LF:/QT5.11/TestCSharpDll -lCppDll
2、在CPP中聲名
extern "C" __declspec(dllexport) int api_add(int a, int b); extern "C" __declspec(dllexport) void api_showBox(const char* content);3、然后就可以直接使用了
qDebug()<<"C# DLL add:"<<api_add(8,5);第二種、直接C++方式調(diào)用C++DLL
//純C++方式調(diào)用
typedef int(CALLBACK *funci)(int,int);
HINSTANCE hdll=LoadLibrary(L"MyDll2.dll"); //L指寬字符串,若不寫L,則會(huì)出現(xiàn)錯(cuò)誤,詳情請自查
funci t3=(funci)GetProcAddress(hdll,"_ZN6MyDll26lllsumEii");//這里原先寫的函數(shù)名為“sum”但是QT編譯后的DLL,通過DLL查看器會(huì)發(fā)現(xiàn)?函數(shù)名變了,所以調(diào)用時(shí)需要使用DLL查看器得到的這個(gè)名字才行,不然無法調(diào)用成功。
qDebug()<<"C++ mode:"<<t3(9,9);
第三 種、QT的顯示調(diào)用
//MyDll test----------------------- typedef int (* fun)(int,int ); QLibrary mylib("MyDll.dll"); //qDebug()<<"in dll function"; if(mylib.load()) { //qDebug()<<"加載DLL OK"; fun fun1 = (fun)mylib.resolve("sum"); //qDebug()<<"MyDLL open:"<<fun1; if(fun1) { qDebug()<<"resolve DLL OK"; int ret = fun1(26,500); qDebug()<<"resolve MyDLL add:"<<ret; }else{ qDebug()<<"resolve MyDLL 失敗"; } }else{ qDebug()<<"加載DLL 失敗"; } //MyDll test-----------------------end?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的QT调用C++写的Dll的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springCloud - 第3篇 -
- 下一篇: C++动态(显式)调用 C++ dll示