如何選擇DLL中函數的導出方式

 本文討論如何選擇DLL函數的導出方式。
    作者:tyc611,2007-05-26
    要導出DLL中的函數,我們有兩種方式:一是使用模塊定義文件(.def文件);二是使用__declspec(dllexport)關鍵字。
 
    那麼,應該選擇哪種方式來導出DLL中的函數呢?要決定如何選擇,你應該首先想清楚這個問題:誰將使用你的DLL?是你自己的應用使用的DLL,還是他人的應用使用的你的DLL作爲第三方DLL?
 
    然後,你參考下面的.def和__declspec(dllexport)方式的優缺點及適用場合來決定如何選擇。
 
    使用.def文件導出的優點
    (1)你能控制導出函數的名字。由於函數的不同調用約定所產生的函數名的Decorated Name是不同的(例如,__stdcall, __cdecl兩種調用約定),所以爲了得到簡潔一致的導出函數名,就必須使用.def文件。
    (2)你能控制導出函數的序號。當你要構造一個供他人使用的第三方DLL時,你就需要確保每次更新的DLL中的函數名和序號都與以前的版本保持一致。當你添加額外的函數到DLL中時,通過賦予新函數較大的序號,從而新的DLL不會影響使用該DLL的應用(不管它是使用函數名還是使用序號調用函數的)。而要做到這些,就必須使用.def文件進行控制。例如,MFC中的DLL就是使用.def文件進行控制的。
    (3)還可控制導出函數的NONAME屬性。通過指定導出函數的NONAME屬性(EXPORTS語句:entryname[=internalname] [@ordinal[NONAME]] [DATA] [PRIVATE]),可以在DLL的導出表中不保存函數名,只保存序號,從而在有很多函數時節約很多空間。但同時也給DLL的使用者帶來了困難,因爲他們只能使用序號調用函數。所以,NONAME屬性的使用並不多見(如果你想使你的DLL充滿神祕,就用吧)。
 
    所以,使用.def的優點是很顯然的,特別適用於第三方DLL的製作。
 
    使用__declspec(dllexport)的優點是簡單、方便,但缺點是顯而易見的,無法完成上面.def的工作。所以,它一般用於應用程序自己使用的DLL。這樣,即使DLL的導出函數的Decorated Name有各種可能,應用在編譯時都可以根據DLL的Import Library找到相應的函數,從而避免了上面.def文件所述的(1)和(2)的兩個缺點。當DLL更新後,要使用新的DLL,也需要應用重新編譯鏈接。

    如果文中有錯誤或遺漏之處,敬請指出,謝謝!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章