DLL學習筆記(VS2005)(持續更新中.......)

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 爲多行語句。)

·         以十進制或十六進制爲基礎指定數值參數。

·         如果字符串參數與匹配,則必須用雙引號 (") 將字符串參數引起。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章