如何使用DLL 2

2021-06-08 07:04:22 字數 3141 閱讀 2241

上文我簡單的介紹了如何建立乙個簡單dll,下面再我簡單的介紹一下如何使用乙個dll。當乙個dll被生成後,它建立了乙個.dll檔案和乙個.lib檔案;這兩個都是你需要的。要使用dll,就需要載入這個dll。

隱式鏈結

這裡有兩個方法來載入乙個dll;乙個方法是捷徑另乙個則相比要複雜些。捷徑是只鏈結到你.lib 檔案並將.dll檔案置入你的新專案的路徑中去。因此,建立乙個新的空的win32控制台專案並新增乙個原始檔。將你做的dll放入你的新專案相同的目錄下。

#include "stdafx.h"

#include "dllsample.h"

#pragma comment(lib, "dllsample.lib") //你也可以在專案屬性中設定庫的鏈結

int main()

這就是載入乙個dll的簡單方法。

顯式鏈結

難點的載入dll的方法稍微有點複雜。你將需要函式指標和一些windows函式。但是,通過這種載入dlls的方法,你不需要dll的.lib或標頭檔案,而只需要dll。

#include

#include

typedef void (*dllfunc)(int);

int main()

dllfunc = (dllfunc)getprocaddress(hinstlibrary, "testdll");

if (dllfunc == null)

dllfunc(123);

std::cin.get();

freelibrary(hinstlibrary);

return(1);

}首先你會注意到:這裡包括進了檔案「windows.h」同時移走了「dllsample.h」。原因很簡單:因為windows.h包含了一些windows函式,當然你現在將只需要其中幾個而已。它也包含了一些將會用到的windows特定變數。你可以去掉dll的標頭檔案(dllsample.h)因為-如我前面所說-當你使用這個方法載入dll時你並不需要它。

下面你會看到:下面的一句**:

typedef void (*dllfunc)(int);

這是乙個函式指標型別的定義。指向乙個函式是乙個int型的引數,返回值為void型別。

乙個hinstance是乙個windows資料型別:是乙個例項的控制代碼;在此情況下,這個例項將是這個dll。你可以通過使用函式loadlibrary()獲得dll的例項,它獲得乙個名稱作為引數。在呼叫loadlibrary函式後,你必需檢視一下函式返回是否成功。你可以通過檢查hinstance是否等於null(在windows.h中定義為0或windows.h包含的乙個標頭檔案)來檢視其是否成功。如果其等於null,該控制代碼將是無效的,並且你必需釋放這個庫。換句話說,你必需釋放dll獲得的記憶體。如果函式返回成功,你的hinstance就包含了指向dll的控制代碼。

一旦你獲得了指向dll的控制代碼,你現在可以從dll中重新獲得函式。為了這樣做,你必須使用函式getprocaddress(),它將dll的控制代碼(你可以使用hinstance)和函式的名稱作為引數。你可以讓函式指標獲得由getprocaddress()返回的值,同時你必需將getprocaddress()轉換為那個函式定義的函式指標。舉個例子,對於add()函式,你必需將getprocaddress()轉換為addfunc;這就是它知道引數及返回值的原因。現在,最好先確定函式指標是否等於null以及它們擁有dll的函式。這只是乙個簡單的if語句;如果其中乙個等於null,你必需如前所述釋放庫。

一旦函式指標擁有dll的函式,你現在就可以使用它們了,但是這裡有乙個需要注意的地方:你不能使用函式的實際名稱;你必需使用函式指標來呼叫它們。在那以後,所有你需要做的是釋放庫如此而已。

模組控制代碼

程序中的每個dll模組被全域性唯一的32位元組的hinstance控制代碼標識。程序自己還有乙個hinstance控制代碼。所有這些模組控制代碼都只有在特定的程序內部有效,它們代表了dll或exe模組在程序虛擬空間中的起始位址。在win32中,hinstance和hmodule的值是相同的,這個兩種型別可以替換使用。程序模組控制代碼幾乎總是等於0x400000,而dll模組的載入位址的預設控制代碼是0x10000000。如果程式同時使用了幾個dll模組,每乙個都會有不同的hinstance值。這是因為在建立dll檔案時指定了不同的基位址,或者是因為引導程式對dll**進行了重定位。

模組控制代碼對於載入資源特別重要。win32 的findresource函式中帶有乙個hinstance引數。exe和dll都有其自己的資源。如果應用程式需要來自於dll的資源,就將此引數指定為dll的模組控制代碼。如果需要exe檔案中包含的資源,就指定exe的模組控制代碼。

但是在使用這些控制代碼之前存在乙個問題,你怎樣得到它們呢?如果需要得到exe模組控制代碼,呼叫帶有null引數的win32函式getmodulehandle;如果需要dll模組控制代碼,就呼叫以dll檔名為引數的win32函式getmodulehandle。

應用程式怎樣找到dll檔案

如果應用程式使用loadlibrary顯式鏈結,那麼在這個函式的引數中可以指定dll檔案的完整路徑。如果不指定路徑,或是進行隱式鏈結,windows將遵循下面的搜尋順序來定位dll:

1. 包含exe檔案的目錄,

2. 程序的當前工作目錄,

3. windows系統目錄,

4. windows目錄,

5. 列在path環境變數中的一系列目錄。

這裡有乙個很容易發生錯誤的陷阱。如果你使用vc++進行專案開發,並且為dll模組專門建立了乙個專案,然後將生成的dll檔案拷貝到系統目錄下,從應用程式中呼叫dll模組。到目前為止,一切正常。接下來對dll模組做了一些修改後重新生成了新的dll檔案,但你忘記將新的dll檔案拷貝到系統目錄下。下一次當你執行應用程式時,它仍載入了老版本的dll檔案,這可要當心!

除錯dll程式

microsoft 的vc++是開發和測試dll的有效工具,只需從dll專案中執行除錯程式即可。當你第一次這樣操作時,除錯程式會向你詢問exe檔案的路徑。此後每次在除錯程式中執行dll時,除錯程式會自動載入該exe檔案。然後該exe檔案用上面的搜尋序列發現dll檔案,這意味著你必須設定path環境變數讓其包含dll檔案的磁碟路徑,或者也可以將dll檔案拷貝到搜尋序列中的目錄路徑下。

或者當你除錯exe程式時,在project setting中,將debug選項卡中的category設定為additional dlls。就可以同時除錯exe和它呼叫的dll(當然,你需要有dll的源**)了。

如何使用vs生成dll

建立dll工程 檔案 新建 專案 visual c win32 win32控制台應用程式 win32專案也可以 填寫專案名稱mydll 確定 下一步 dll 附加選項 對空專案打鉤 完成。到這裡dll工程就建立完畢了,下面新建兩個檔案mydll.cpp和mydll.h。在.cpp檔案中,需要匯出的函...

如何使用dll和lib

針對vs2010下的個人理解 一 1 工程目錄 即是 vcxproj 或者 vcxproj.filters 檔案所在的目錄,即你寫的 的位置。2 解決方案目錄 即是 sln 檔案的所在的目錄。3 表示的當前目錄。4 表示當前目錄的前乙個目錄。二 當我們生成乙個dll檔案時,會產生dll檔案和lib檔...

如何建立DLL

動態鏈結庫 dll 是從c語言函式庫和pascal庫單元的概念發展而來的。所有的c語言標準庫函式都存放在某一函式庫中。在鏈結應用程式的過程中,鏈結器從庫檔案中拷貝程式呼叫的函式 並把這些函式 新增到可執行檔案中。這種方法同只把函式儲存在已編譯的obj檔案中相比更有利於 的重用。但隨著windows這...