1. 程式人生 > >Qt呼叫C的DLL

Qt呼叫C的DLL

在QT開發時,有裡需要呼叫已經寫好的DLL來實現一些功能,那要如何呼叫呢?我們先建一個DLL。

在VS2012中建立C++ WIN32的DLL空專案DllTest,然後新增標頭檔案和CPP檔案,具體如下

Calculate.h

#ifdef __cplusplus   
#define EXPORT extern "C" __declspec (dllexport)   
#else   
#define EXPORT __declspec (dllexport)   
#endif   

EXPORT int  sum(int a,int b);   

Calculate.cpp

#include "windows.h"   
#include "Calculate.h"


int WINAPI DllMain(_In_ HANDLE _HDllHandle, _In_ DWORD _Reason, _In_opt_ LPVOID _Reserved)   
{   
    return TRUE;   
}  

EXPORT int sum(int a,int b)  
{   
    return a+b;   
}  
編譯後得到DllTest.dll,使用DLL檢視工具,檢視匯出的DLL是否OK,檢視結果如下。

可以看到sum函式已經匯出到DLL了,下面是在QT中的呼叫。

在VS2012中建立一個QT的控制檯專案,並將DllTest.dll複製到專案下(與main.cpp同級目錄)。然後在main.cpp中新增如下程式碼

main.cpp

#include <QLibrary>
#include <QtDebug>

typedef int (*SumFunction)(int,int);

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

    QLibrary library("DllTest");
    library.load();
    if (!library.isLoaded())
    {
        qDebug()<<"Cannot load library.";
        return 0;
    }

    SumFunction sum=(SumFunction)library.resolve("sum");
    if (sum)
    {
        qDebug()<<"sum="<<sum(1,9);
    }

    return 0;
}

下面是執行結果

利用QLibrary來載入dll,同時定義一個函式指標SumFunction來接收sum函式,最後實現呼叫。

相關推薦

關於QT呼叫MFC動態庫時傳遞中文字元亂碼問題

凡是亂碼,一定是解碼方式不對,在此做個小小的總結。 MFC CString和QT QString都採用unicode編碼 MFC中的char *採用GBK編碼,QT中的char *採用UTF-8編碼,這裡關於字元的編碼,有個規律就是和原始碼檔案儲存的編一致。    

Qt呼叫dll的隱式呼叫

Qt呼叫dll的隱式呼叫 一、前言: 二、Qt呼叫Qt寫的dll 三、Qt呼叫vs寫的dll(為何要單獨講?因為其中有坑,後面補上) 四、總結分析 一、前言: Qt呼叫dll的例子,在網上找了很多個,始

QT 呼叫執行 linux指令碼的三種方法

在linux系統下,Qt執行shell命令的方式有3種: (1)QProcess:execute("ls"); (2)system("ls"); (3)QProcess *process = new QProcess(); process->start("ls"); 注1:以上

Qt呼叫VTK的詳細教程

Qt呼叫VTK的詳細教程(PCL1.8.1 && VTK8.0) 1.VTK庫在三維視覺化顯示方面(醫學影象、地質、氣象等領域)具有廣泛的應用,呼叫該庫的傳統方式是通過VS,結合Cmake檔案進行編譯。  2.Qt在介面設計、編譯方面具有良好的優勢,如果能使用Qt進

Qt呼叫自己編譯的libglog.a出現問題

我確定依據正確匯入庫後,依舊出現未定義的引用。 undefined reference to _imp___ZN6google17InitGoogleLoggingEPKc 嘗試過重新編譯,調整編譯引數,都不行。debug和release模式也沒有影響。最後找到Stack Overflow上有這

QT呼叫VS生成的DLL(無標頭檔案)

目錄 一、準備知識 1.1QT呼叫DLL的兩種常見方法簡介 呼叫說明:關於QT呼叫DLL方法主要分兩種,一種是顯示呼叫,另一種是隱式呼叫。 宣告: 事先我已經自己動手寫了一個簡單的dll檔案(myDLL.dll),C版介面的。首

Windows下QT呼叫python指令碼

.pro檔案 #------------------------------------------------- # # Project created by QtCreator 2018-10-13

Qt呼叫Windows Webbrowser控制元件,呼叫JS方法

說明: Qt版本為4.7.4    編譯工具為VS2008 一.需要包含的標頭檔案 #include"ExDisp.h" #include"comutil.h" #include"atlcomcli.h" #include "Mshtml.h" 庫檔名: comsup

QT呼叫C#寫的Dll

參見: https://blog.csdn.net/weixin_42420155/article/details/81060945 C#寫的dll是沒有dllMain入口函式的,是一種中間語言,需要.Net執行時進行做本地化工作,因此如果要呼叫C#寫的dll,需要依賴.Net執行時,然而Qt中還無法直接

Qt 呼叫GDB除錯 Arm程式 詳細步驟----可單步執行每一行

前言本人交叉編譯環境 Ubuntu 10.04(虛擬機器),編譯工具鏈 arm-hisiv100nptl-linux,Qt 4.8.5 ,QtCreator1.3.11、在虛擬機器Ubuntu 10.04上,安裝GDB除錯工具之前,要安裝預處理模組:sudo apt-get

qt 呼叫zlib壓縮與解壓縮功能

2  QT 中如何呼叫zip進行解壓縮     ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));     從壓縮檔案中讀取給定大小的解壓位元組數。     如果輸入檔案不是gz

[Qt]呼叫外部執行程式(Windows & Mac)

Qt本身是一個跨平臺開發工具,對於不同平臺的外部程式又該如何呼叫呢     QStringList args;  //如果需要啟動引數的話 #ifdef Q_OS_WIN     QProcess:

QT 呼叫外部程式

QT呼叫外部程式有下面幾種方法: //1.通過呼叫linux C 函式 system("opt/myApp"); //2.通過QProcess,阻塞呼叫 QProcess::execute("/opt/myApp"); //3.通過QProcess,非阻塞呼叫 QPr

QT呼叫VC 動態連結庫 解決QT開啟或儲存檔案時閃退的問題

1,MFC需要用靜態庫 2,MFC中字串編譯用unicode(1個漢字佔2位元組),QT中用的UTF8(1個漢字佔3位元組),因此MFC中需要將unicode轉換成UTF8 貼出QT中的程式碼:QT中做成靜態函式,方便其他位置進行呼叫 static QString Mfc

QT呼叫印表機列印html網頁及檔案

工程裡用到 QWebView, 所以要在.pro里加上 QT += webkit webkitwidgets 列印用到了 QPrinter, 所以要在.pro里加上 qtHaveModule(printsupport): QT += printsuppor

qt呼叫動態庫(已驗證,方法可行)

之前一直不明白如何在qt程式中,呼叫動態庫,後來看了網上的一些文章,自己試驗了一下,總結出了可行的辦法。 一個動態庫會有三種檔案組成,標頭檔案(.h)    lib檔案    dll檔案。 其中lib檔案表明了動態庫的入口,並沒有實際的內容,實際的內容在dll檔案中。 標頭

Qt呼叫VS生成的C靜態庫

1,生成dll和lib庫 在vs2010中新建工程,在嚮導中選擇DLL,如下圖所示: 新建兩個檔案mydll.h和mydll.c mydll.h程式碼如下: 1 #ifndef MYDLL_H 2 #define MYDLL_H 3 #ifdef __cpluspl

Qt呼叫C的DLL

在QT開發時,有裡需要呼叫已經寫好的DLL來實現一些功能,那要如何呼叫呢?我們先建一個DLL。 在VS2012中建立C++ WIN32的DLL空專案DllTest,然後新增標頭檔案和CPP檔案,具體如下 Calculate.h #ifdef __cplusplus #

Qt呼叫WebService

    寫WebService有一段時間了,把自己收集的和理解的關於WebService工作原理做個總結.     WebService主要採用了Http協議,Http是個基於Tcp/Ip的應用層協議:(注:現在的大部分WebService開發已經能很好的支援socket的實時通訊了.但http依然是它的

QT呼叫百度地圖api

整個流程參照: http://blog.csdn.net/lizuqingblog/article/details/18357721?utm_source=tuicool&utm_medium=referral 但是,參照該部落格做出來的效果,無法顯示地圖。 查閱官