DLL即動態鏈接庫(Dynamic-Link Libaray)的縮寫,相當於Linux下的共享對象。Windows系統中大量采用了DLL機制,甚至內核的結構很大程度依賴與DLL機制。Windows下的DLL文件和EXE文件實際上是一個概念,都是PE格式的二進制文件。一般的動態庫程序有lib文件和dll文件,lib文件是編譯時期連接到應用程序中的,而dll文件是運行時才會被調用的。
為了更好的理解DLL,首先介紹一下導出和導入的概念。
(1)導出與導入
在ELF(Linux下動態庫的格式),共享庫中所有的全局函數和變量在默認情況下都可以被其他模塊使用,即ELF默認導出所有的全局符號。DLL不同,需要顯式地“告訴”編譯器需要導出某個符號,否則編譯器默認所有的符號都不導出。
程序使用DLL的過程其實是引用DLL中導出函數和符號的過程,即導入過程。對於從其他DLL導入的符號,需要使用“__declspec(dllimport)”顯式聲明某個符號為導入符號。在ELF中,使用外部符號時,不需要額外聲明該符號是從其他共享對象導入的。
指定符號的導入導出一般有如下兩種方法:
1)MSVC編譯器提供了一系列C/C++的擴展來指定符號的導入導出,即__declspec屬性關鍵字。
__declspec(dllexport) 表示該符號是從本DLL導出的符號
__declspec(dllimport) 表示該符號是從別的DLL中導入的
2)使用“.def”文件來聲明導入到導出符號,詳細參考《程序員的自我修養--鏈接、裝載與庫》。
應用程序使用DLL可以采用兩種方式:一種是隱式鏈接(調用),另一種是顯式鏈接。在使用DLL之前首先要知道DLL中函數的結構信息。
4、DLL創建
下面是頭文件內容:創建工程時有默認的導出函數,這里將其刪除掉重新寫的。
4、DLL創建
以下是vs生成的代碼和我添加的測試導出函數
注意:a.DLL中導出函數的聲明有兩種方式:在函數聲明中加上__declspec(dllexport);采用模塊定義(.def)文件聲明。詳見:http://www.cnblogs.com/enterBeijingThreetimes/archive/2010/08/04/1792099.html
b.對於C文件創建dll時或者想使用C編譯器創建dll時,建議使用 extern “C” 標志,參見extern "C"的簡單解析。
下一次講如何調用dll導出的函數