dll匯出的函式 和 匯出類在呼叫時,有些區別,這裡暫時不講,直說簡單的匯出函式;
#include "stdafx.h"
#include "mathdll.h"
#pragma comment(lib, "mathdll.lib") //你也可以在專案屬性中設定庫的鏈結
int main()
在標頭檔案或是包含標頭檔案下面新增函式指標,函式裡面兩個int型別引數,函式返回值是int型別,如下:
typedef int (*dllfunc)(int,int);
dllfunc padd;
hinstance h_instance = loadlibrary(_t("mathdll.dll"));
if(h_instance == null)
padd = (dllfunc)getprocaddress(h_instance,("add"));
if(padd == null)
int c = padd(5,9);
cstring str;
str.format(_t("輸出加法數字是:%d"),c);
messagebox(str,_t("加法演算法"));
freelibrary(h_instance);
我這裡測試時建立的mfc的對話方塊程式,所以不需要包含特殊標頭檔案,如果不是的話,考慮要包含#include "windows.h",同時顯式鏈結不需要包含dll的標頭檔案,
下面是對dll一些解釋,這是我從別的文章拿過來的!
乙個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的源**)了。
程式執行:
完成
DLL匯出函式
經常使用vc6的dependency檢視dll匯出函式的名字,會發現有dll匯出函式的名字有時大不相同,導致不同的原因大多是和編譯dll時候指定dll匯出函式的界定符有關係。vc 支援兩種語言 即c c 這也是造成dll匯出函式差異的根源 我們用vs2008新建個dll工程,工程名為 testdll...
DLL匯出函式
使用def檔案從dll匯出 模組定義 def 檔案時包含乙個或多個描述dll各種屬性的module語句的文字檔案。如果不使用 declspec dllexport 關鍵字匯出dll的函式,則dll需要.def檔案。def檔案必須至少包含下列模組定義語句 檔案中的第乙個語句必須是library語句。此...
DLL匯出類和匯出函式
1 動態庫dll中的類或者函式有時候要被其他的庫呼叫,因此需要被其他庫呼叫的類或者函式需要進行匯出。2 首先編寫需要匯出的dll,新建乙個工程設定應用程式型別為dll 3 類的 如下 標頭檔案 pragma once define ex port declspec dllexport using n...