資源描述:
《c++中dll函數(shù)的導(dǎo)出和導(dǎo)入》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、1.使用DEF文件從DLL導(dǎo)出模塊定義(.def)文件是包含一個(gè)或多個(gè)描述DLL各種屬性的Module語(yǔ)句的文本文件。如果不使用__declspec(dllexport)關(guān)鍵字導(dǎo)出DLL的函數(shù),則DLL需要.def文件。.def文件必須至少包含下列模塊定義語(yǔ)句:文件中的第一個(gè)語(yǔ)句必須是LIBRARY語(yǔ)句。此語(yǔ)句將.def文件標(biāo)識(shí)為屬于DLL。LIBRARY語(yǔ)句的后面是DLL的名稱(chēng)。鏈接器將此名稱(chēng)放到DLL的導(dǎo)入庫(kù)中。EXPORTS語(yǔ)句列出名稱(chēng),可能的話還會(huì)列出DLL導(dǎo)出函數(shù)的序號(hào)值。通過(guò)在函數(shù)名的后面加上@符和一個(gè)數(shù)字,給函數(shù)分配序號(hào)值。當(dāng)指定序號(hào)值時(shí),序號(hào)值的
2、范圍必須是從1到N,其中N是DLL導(dǎo)出函數(shù)的個(gè)數(shù)。如果希望按序號(hào)導(dǎo)出函數(shù),請(qǐng)參見(jiàn)按序號(hào)而不是按名稱(chēng)從DLL導(dǎo)出函數(shù)以及本主題。例如,包含實(shí)現(xiàn)二進(jìn)制搜索樹(shù)的代碼的DLL看上去可能像下面這樣:LIBRARYBTREEEXPORTSInsert@1Delete@2Member@3Min@4如果使用MFCDLL向?qū)?chuàng)建MFCDLL,則向?qū)槟鷦?chuàng)建主干.def文件并將其自動(dòng)添加到項(xiàng)目中。添加要導(dǎo)出到此文件的函數(shù)名。對(duì)于非MFCDLL,必須親自創(chuàng)建.def文件并將其添加到項(xiàng)目中。如果導(dǎo)出C++文件中的函數(shù),必須將修飾名放到.def文件中,或者通過(guò)使用外部“C”定義具有標(biāo)準(zhǔn)
3、C鏈接的導(dǎo)出函數(shù)。如果需要將修飾名放到.defforthequalityofreviewsandreview.Article26threview(a)theCCRAcompliance,whethercopiesofchecks;(B)whetherdoubleinvestigation;(C)submissionofprogramcompliance,investigationorexaminationofwhetherviewsareclear;(D)theborrower,guarantorloans文件中,則可以通過(guò)使用DUMPBIN工具或/MAP鏈接器
4、選項(xiàng)來(lái)獲取修飾名。請(qǐng)注意,編譯器產(chǎn)生的修飾名是編譯器特定的。如果將VisualC++編譯器產(chǎn)生的修飾名放到.def文件中,則鏈接到DLL的應(yīng)用程序必須也是用相同版本的VisualC++生成的,這樣調(diào)用應(yīng)用程序中的修飾名才能與DLL的.def文件中的導(dǎo)出名相匹配。如果生成擴(kuò)展DLL并使用.def文件導(dǎo)出,則將下列代碼放在包含導(dǎo)出類(lèi)的頭文件的開(kāi)頭和結(jié)尾:#undefAFX_DATA#defineAFX_DATAAFX_EXT_DATA//#undefAFX_DATA#defineAFX_DATA這些代碼行確保內(nèi)部使用的MF
5、C變量或添加到類(lèi)的變量是從擴(kuò)展DLL導(dǎo)出(或?qū)耄┑摹@?,?dāng)使用DECLARE_DYNAMIC派生類(lèi)時(shí),該宏擴(kuò)展以將CRuntimeClass成員變量添加到類(lèi)。省去這四行代碼可能會(huì)導(dǎo)致不能正確編譯或鏈接DLL,或在客戶端應(yīng)用程序鏈接到DLL時(shí)導(dǎo)致錯(cuò)誤。當(dāng)生成DLL時(shí),鏈接器使用.def文件創(chuàng)建導(dǎo)出(.exp)文件和導(dǎo)入庫(kù)(.lib)文件。然后,鏈接器使用導(dǎo)出文件生成DLL文件。隱式鏈接到DLL的可執(zhí)行文件在生成時(shí)鏈接到導(dǎo)入庫(kù)。請(qǐng)注意,MFC本身使用.def文件從MFCx0.dll導(dǎo)出函數(shù)和類(lèi)。1.使用_declspec(dllexport)從DLL導(dǎo)出Micr
6、osoft在VisualC++的16位編譯器版本中引入了_export,使編譯器得以自動(dòng)生成導(dǎo)出名并將它們放到一個(gè).lib文件中。然后,此.lib文件就可以像靜態(tài).lib那樣用于與DLL鏈接。forthequalityofreviewsandreview.Article26threview(a)theCCRAcompliance,whethercopiesofchecks;(B)whetherdoubleinvestigation;(C)submissionofprogramcompliance,investigationorexaminationofwheth
7、erviewsareclear;(D)theborrower,guarantorloans在更新的編譯器版本中,可以使用_declspec(dllexport)關(guān)鍵字從DLL導(dǎo)出數(shù)據(jù)、函數(shù)、類(lèi)或類(lèi)成員函數(shù)。_declspec(dllexport)會(huì)將導(dǎo)出指令添加到對(duì)象文件中,因此您不需要使用.def文件。當(dāng)試圖導(dǎo)出C++修飾函數(shù)名時(shí),這種便利最明顯。由于對(duì)名稱(chēng)修飾沒(méi)有標(biāo)準(zhǔn)規(guī)范,因此導(dǎo)出函數(shù)的名稱(chēng)在不同的編譯器版本中可能有所變化。如果使用_declspec(dllexport),僅當(dāng)解決任何命名約定更改時(shí)才必須重新編譯DLL和依賴(lài).exe文件。許多導(dǎo)出指令(如序號(hào)
8、、NONAME和PRIV