http://hi.baidu.com/130503/blog/item/496afe735d21c11a8601b0e0.html 【上】
http://hi.baidu.com/130503/blog/item/2d5a73cc422fff1600e928e0.html 【下】
》》》》
內(nèi)容摘錄《《《《
中間的小結(jié)
牢記一點,說到底,
DLL是對應C語言的動態(tài)鏈接技術(shù),在輸出C函數(shù)和變量時顯得方便快捷;而在輸出C++類、函數(shù)時需要通過各種手段,而且也并沒有完美的解決方案,除非客戶端也是c++。
記住,只有
COM是對應C++語言的技術(shù)。下面開始對各各問題一一小結(jié)。
顯式調(diào)用和隱式調(diào)用
何時使用顯式調(diào)用?何時使用隱式調(diào)用?我認為,
只有一個時候使用顯式調(diào)用是合理的,就是當客戶端不是C/C++的時候。這時是無法隱式調(diào)用的。例如用VB調(diào)用C++寫的dll。(VB我不會,所以沒有例子)
Def和__declspec(dllexport)
其實
def的功能相當于extern “C” __declspec(dllexport),所以它也僅能處理C函數(shù),而不能處理重載函數(shù)。
而__declspec(dllexport)和__declspec(dllimport)配合使用能夠適應任何情況,因此__declspec(dllexport)是更為先進的方法。所以
,目前普遍的看法是不使用def文件,我也同意這個看法。
從其它語言調(diào)用DLL
從其它編程語言中調(diào)用DLL,有兩個最大的問題,第一個就是函數(shù)符號的問題,前面已經(jīng)多次提過了。這里有個兩難選擇,若使用extern “C”,則函數(shù)名稱保持不變,調(diào)用較方便,但是不支持函數(shù)重載等一系列c++功能;若不使用extern “C”,則調(diào)用前要查看編譯后的符號,非常不方便。
第二個問題就是函數(shù)調(diào)用壓棧順序的問題,即__cdecl和__stdcall的問題。__cdecl是常規(guī)的C/C++調(diào)用約定,這種調(diào)用約定下,函數(shù)調(diào)用后棧的清理工作是由調(diào)用者完成的。__stdcall是標準的調(diào)用約定,即這些函數(shù)將在返回到調(diào)用者之前將參數(shù)從棧中刪除。
這兩個問題DLL都不能很好的解決,只能說湊合著用。但是在COM中,都得到了完美的解決。所以,
要在Windows平臺實現(xiàn)語言無關(guān)性,還是只有使用COM中間件。
總而言之,除非客戶端也使用C++,否則dll是不便于支持函數(shù)重載、類等c++特性的。DLL對c函數(shù)的支持很好,我想這也是為什么windows的函數(shù)庫使用C加dll實現(xiàn)的理由之一。
在VC中編寫DLL
在VC中創(chuàng)建、編譯、鏈接dll是非常方便的,點擊fileàNewàProjectàWin32 Dynamic-Link Library,輸入dll名稱dll_InVC然后點擊確定。然后選擇A DLL that export some symbols,點擊Finish。即可得到一個完整的DLL。