日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT调用C++写的Dll

發(fā)布時(shí)間:2023/12/18 c/c++ 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT调用C++写的Dll 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。