在C 中呼叫DLL中的函式 靜態呼叫和動態呼叫

2021-06-19 04:55:37 字數 1497 閱讀 1438

一、靜態呼叫

1.首先生成乙個專案testdll,把你的mydll.dll和mydll.lib拷貝到你的目標工程的debug目錄下,也可以拷貝到windows的system目錄下;(windows系統將遵循下面的搜尋順序來定位dll:1.包含exe檔案的目錄;2.當前工程的工作目錄;3.windows系統目錄;4.windows目錄;5.列在path環境變數中的一系列目錄);

2.在dlltest.h和dlltest.cpp檔案中分別輸入如下**:

#pragma comment(lib, "mydll.lib")

extern "c" _declspec(dllimport) int add(int a, int b);

extern "c" _declspec(dllimport) int sub(int a, int b);

#include "dlltest.h"

#include int main()

dlltest.h中的關鍵字pragma comment是要visual c++編譯器在link時,鏈結到mydll.lib檔案。當然,我們也可以不使用#pragma comment(lib, "mydll.lib")語句,而是直接開啟工程的屬性->鏈結器(link)->輸入,在附加依賴項中新增mydll.lib即可。

補充:相應的,建立dll中匯出函式時,我們只需要在函式前面使用關鍵字 extern "c" _declspec(dllexport)。

二、動態呼叫

動態呼叫(也稱顯示鏈結),是應用程式再執行過程中隨時可以載入dll檔案,也可以隨時解除安裝dll檔案,這是隱式鏈結所無法做到的,所以顯示鏈結具有更好的靈活性,對於解釋性語言更為合適。

//將dll載入到當前的應用程式並返回當前dll檔案的控制代碼;

hinstance hdllinst = loadlibrary("mydll.dll");

if(hdllinst)

//解除安裝dll檔案;

freelibrary(hdllinst);

}

另外,使用getprocaddress()函式時,可以利用makeintresource()函式直接使用dll中函式出現的順序號,如將getprocaddress(hdllinst, "yourfunctionname") 改為getprocaddress(hdllinst, makeintresource(1)) (函式yourfunctionname()在dll中的順序號是2),這樣呼叫dll中的函式速度很快,但是要記住函式的順序號,否則會發生錯誤。

【關於如何檢視dll檔案匯出函式的資訊】

在microsoft visual studio 10.0\vc\bin 目錄下提供了dumpbin.exe程式,可以用來檢視dll檔案中的函式結構:在visual studio命令列方式下,首先進入dll檔案所在目錄下,輸入以下命令回車: dumpbin -exports mydll.dll,輸出資訊中列出了所有匯出函式的序號及函式名。

在C 中呼叫C 寫的DLL

這裡兩個問題,一是如何將c 編譯成dll,二是在c 和c 中呼叫這個dll 1,寫c 的dll,參照以下link,它說的是c 中的dll呼叫,所以肯定成功 2,寫乙個c 呼叫上面寫的dll 2.1將以上的dll拷貝到debug release目錄,然後寫c 程式如下 using system usi...

在lua中呼叫DLL

整整的花了乙個下午的時候,才在lua中呼叫了動態鏈結庫。比起其他指令碼語言,lua的呼叫方式算是比較繁瑣的,但是lua的程式設計思想非常的統一,即lua和c之間的傳值都是通過棧進行的,目前為止我還沒有深入的去了解這個 棧 但是這並不妨礙去使用 棧 當我們在乙個空的工程中寫下幾個c c 的函式,然後把...

在c 中呼叫並除錯C 的DLL

被c 呼叫的dll一般只需要把匯出的函式以適當的形式呈現即可呼叫,比如 extern c declspec dllexport bool integrate3 這樣的函式,在c 裡面宣告如 dllimport dll callingconvention callingconvention.stdca...