宣告:事先我已經自己動手寫了乙個簡單的dll檔案(mydll.dll),c版介面的。並且用我前兩篇有關dll文章裡面的方法,從dll中匯出了導入庫(.lib)檔案,dll中有兩個函式,原型如下:
void
helloworld();
//函式內部呼叫
win32 api,
功能是彈出乙個
helloworld
提示框int
add(
inta,
intb);
//實現兩個數相加,並返回結果
複製**
下面分別通過顯示呼叫和隱式呼叫兩種方法,來模擬qt如何呼叫外部dll檔案中的功能函式,follow me....
預備知識:
1、如果在沒有導入庫檔案(.lib),而只有標頭檔案(.h)與動態鏈結庫(.dll)時,我們才需要顯示呼叫,如果這三個檔案都全的話,我們就可以使用簡單方便的隱式呼叫。
2、通常windows下程式顯示呼叫dll的步驟分為三步(三個函式):loadlibrary()、getprocadress()、freelibrary()
其中,loadlibrary()函式用來載入指定的dll檔案,載入到呼叫程式的記憶體中(dll沒有自己的記憶體!)
getprocaddress()
函式檢索指定的動態鏈結庫
(dll)
中的輸出庫函式位址,以備呼叫
freelibrary()
釋放dll所佔空間
1
、顯示呼叫 qt
提供了乙個 qlibrary類供顯示呼叫。下面給出乙個完整的例子:12
#include
3#include
4#include
5#include
"dll.h"
//引入標頭檔案
6typedef
int(*fun)(
int,
int);
//定義函式指標,以備呼叫
7int
main(
intargc,
char
**argv)822
else
23qmessagebox::information(null,
"no"
,"linke to function is not ok!!!!"
);24}25
else
26qmessagebox::information(null,
"no"
,"dll is not loaded!");
27 return 0;
//載入失敗則退出 28
} 複製**
mydll.dll
為自定義的dll檔案,將其複製到程式的輸出目錄下就可以呼叫。顯然,顯示呼叫**書寫量巨大,實在不方便。 2
、隱式呼叫
1
、首先我們把.h與
.lib/.a
檔案複製到程式當前目錄下,然後再把
dll檔案複製到程式的輸出目錄,
2
、下面我們在
pro檔案中,新增
.lib
檔案的位置:
libs
+=-l
d:/hitempt/api/
-lmydll -l
引數指定
.lib/.a
檔案的位置
-l 引數指定導入庫檔名
(不要加副檔名)
另外,導入庫檔案的路徑中,反斜槓用的是向右傾斜的
3
、在程式中include標頭檔案(我試驗用的dll是用c寫的,因此要用extern "c")
下面是隱式呼叫的例項**: 1
2#include
3extern
"c"
//由於是c版的
dll檔案,在
c++中引入其標頭檔案要加
extern"c" {},注意4
7int
main(
intargv ,
char
**argv)8
複製**
還是隱式呼叫方便啊,直接就可以呼叫dll中的函式...
#include "stdafx.h"
//#include ""
#include
#include
int _tmain(int argc, _tchar* argv)
{lpcstr lpprocnamegetcupid = "getcupid";
lpcstr lpprocnamegetnetworkaddr = "getnetworkaddr";
lpcstr lpprocnamegetharddiskid = "getharddiskid";
lpcstr lpprocnamegetbiosid = "getbiosid";
typedef unsigned char*(*getcupid)(void);
typedef unsigned char*(*getnetworkaddr)(void);
typedef unsigned char*(*getharddiskid)(void);
typedef unsigned char*(*getbiosid)(void);
hmodule hlib = loadlibrary("hardwaredll.dll"); //如果有必要請寫明路徑
getcupid getcupid = (getcupid)getprocaddress(hlib, lpprocnamegetcupid);
getnetworkaddr getnetworkaddrid = (getcupid)getprocaddress(hlib, lpprocnamegetnetworkaddr);
getharddiskid getharddiskid = (getcupid)getprocaddress(hlib, lpprocnamegetharddiskid);
getbiosid getbiosid = (getcupid)getprocaddress(hlib, lpprocnamegetbiosid);
std::cout<<"getcupid-----------"<<*getcupid return 0; 宣告 事先我已經自己動手寫了乙個簡單的dll檔案 mydll.dll c版介面的。並且用我前兩篇有關dll文章裡面的方法,從dll中匯出了導入庫 lib 檔案,dll中有兩個函式,原型如下 void helloworld 函式內部呼叫win32 api,功能是彈出乙個helloworld提示框 in... 隱式呼叫 1 首先我們把 h 與 lib a 檔案複製到程式當前目錄下,然後再把dll檔案複製到程式的輸出目錄,2 下面我們在pro檔案中,新增 lib 檔案的位置 libs l d hitempt api l mydll l 引數指定 lib a 檔案的位置 l 引數指定導入庫檔名 不要加副檔名 ... qt呼叫dll中的功能函式 宣告 事先我已經自己動手寫了乙個簡單的dll檔案 mydll.dll c版介面的。並且用我前兩篇有關dll文章裡面的方法,從dll中匯出了導入庫 lib 檔案,dll中有兩個函式,原型如下 void helloworld 函式內部呼叫win32 api,功能是彈出乙個he...Qt呼叫dll中的功能函式
Qt呼叫dll中的功能函式
Qt呼叫dll中的功能函式