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