DLL學習筆記(VS2005)
建立DLL項目
項目的相關配置:
l DLL輸出
項目屬性-->連接器-->常規-->輸出文件:更改生成的DLL文件名。
l 模塊定義文件(後面詳述)
項目屬性-->連接器-->常規-->輸入-->模塊定義文件:更改def文件名。
導出定義的方法
有三種導出定義的方法,按照建議的使用順序依次爲:
1. 源代碼中的 __declspec(dllexport)
2. .def 文件中的 EXPORTS 語句
3. LINK 命令中的 /EXPORT 規範
所有這三種方法可以用在同一個程序中。
編寫導出函數
stdafx.h 或 頭文件裏
#define DLL_EXPORT __declspec(dllexport)
#define DLL_IMPORT __declspec(dllimport)
聲明:
extern "C" {
DLL_EXPORT int Add(int x, int y);
DLL_EXPORT void Function();
}
使用DLL——動態(函數指針)
(1)聲明 函數指針
typedef int(*lpAddFun)(int, int);
typedef void(*lpFunction)();
(2)獲取DLL
HINSTANCE hDll; // 實例句柄,這裏是DLL的句柄
hDll = LoadLibraryW(_T("..//Debug//MyLib1.dll"));
if (hDll == NULL) {
FreeLibrary(hDll);
}
(3)獲取DLL中的函數
lpAddFun _AddFun; // lpAddFun 函數指針
lpFunction _Function; // lpFunction 函數指針
_AddFun = (lpAddFun)GetProcAddress(hDll, "Add");
_Function = (lpFunction)GetProcAddress(hDll, "Function");
(4)使用DLL中的函數
_Function();
std::cout << _AddFun(10, 25) << std::endl;
(5)釋放DLL
FreeLibrary(hDll);
·
使用DLL——靜態
#pragma comment(lib, "..//Debug//MyLib1.lib")
extern "C" {
DLL_IMPORT int Add(int x,int y);
DLL_IMPORT int Function();
}
int main(int argc, char* argv[]) {
Function();
std::cout << Add(10, 25) << std::endl;
return 1;
}
模塊定義文件 (*.def)
l 通常也可以不編寫此文件,因爲存在可代替模塊定義語句使用的鏈接器選項。
l 也可以將 __declspec(dllexport) 用作指定導出函數的手段。
(一)模塊定義語句規則:
下列語法規則適用於 .def 文件中的所有語句。其他適用於特定語句的規則與各語句一起加以說明。
· 語句、屬性關鍵字和用戶指定的標識符區分大小寫。
· 包含空格或分號 (;) 的長文件名必須用引號 (") 引起。
· 使用一個或多個空格、製表符或換行符,將語句關鍵字同其參數分開和將各語句分開。指定參數的冒號 (:) 或等號 (=) 兩旁有零個或多個空格、製表符或換行符。
· 如果使用 NAME 或 LIBRARY 語句,則這些語句必須位於所有其他語句之前。
· 在 .def 文件中,SECTIONS 和 EXPORTS 語句可以出現多次。每個語句都可以採用多個規範,各規範間必須用一個或多個空格、製表符或換行符分開。語句關鍵字必須在第一個規範的前面出現一次,並且可以在每個附加規範的前面重複。
· 許多語句都具有等效的 LINK 命令行選項。有關其他詳細信息,請參見相應的 LINK 選項說明。
· .def 文件中的註釋由每個註釋行開始處的分號 (;) 指定。註釋不能與語句共享一行,但可以在多行語句的規範間出現。((SECTIONS 和 EXPORTS 爲多行語句。)
· 以十進制或十六進制爲基礎指定數值參數。
· 如果字符串參數與保留字匹配,則必須用雙引號 (") 將字符串參數引起。