若要確定用于導(dǎo)出函數(shù)的方法(.def 文件或 __declspec(dllexport) 關(guān)鍵字),請(qǐng)回答下列問(wèn)題:
使用 .DEF 文件的優(yōu)缺點(diǎn)
在 .def 文件中導(dǎo)出函數(shù)使您得以控制導(dǎo)出序號(hào)。當(dāng)將附加的導(dǎo)出函數(shù)添加到 DLL 時(shí),可以給它們分配更高的序號(hào)值(高于任何其他導(dǎo)出函數(shù))。當(dāng)您進(jìn)行此操作時(shí),使用隱式鏈接的應(yīng)用程序不必與包含新函數(shù)的新導(dǎo)入庫(kù)重新鏈接。這非常重要,例如,在設(shè)計(jì)將由許多應(yīng)用程序使用的第三方 DLL 時(shí)。可以通過(guò)添加附加功能不斷地增強(qiáng) DLL,同時(shí)確保現(xiàn)有應(yīng)用程序繼續(xù)正常使用新的 DLL。MFC DLL 是使用 .def 文件生成的。
使用 .def 文件的另一個(gè)優(yōu)點(diǎn)是:可以使用 NONAME 屬性導(dǎo)出函數(shù),該屬性?xún)H將序號(hào)放到 DLL 的導(dǎo)出表中。對(duì)具有大量導(dǎo)出函數(shù)的 DLL,使用 NONAME 屬性可以減小 DLL 文件的大小。有關(guān)編寫(xiě)模塊定義語(yǔ)句的信息,請(qǐng)參見(jiàn)模塊定義語(yǔ)句的規(guī)則。有關(guān)序號(hào)導(dǎo)出的更多信息,請(qǐng)參見(jiàn)按序號(hào)而不是按名稱(chēng)從 DLL 導(dǎo)出函數(shù)。
使用 .def 文件的主要缺點(diǎn)是:在 C++ 文件中導(dǎo)出函數(shù)時(shí),必須將修飾名放到 .def 文件中,或者通過(guò)使用外部“C”用標(biāo)準(zhǔn) C 鏈接定義導(dǎo)出函數(shù),以避免編譯器進(jìn)行名稱(chēng)修飾。
如果需要將修飾名放到 .def 文件中,則可以通過(guò)使用 DUMPBIN 工具或 /MAP 鏈接器選項(xiàng)來(lái)獲取修飾名。請(qǐng)注意,編譯器產(chǎn)生的修飾名是編譯器特定的。如果將 Visual C++ 編譯器產(chǎn)生的修飾名放到 .def 文件中,則鏈接到 DLL 的應(yīng)用程序必須也是用相同版本的 Visual C++ 生成的,這樣調(diào)用應(yīng)用程序中的修飾名才能與 DLL 的 .def 文件中的導(dǎo)出名相匹配。
使用 __declspec(dllexport) 的優(yōu)缺點(diǎn)
使用 __declspec(dllexport) 非常方便,因?yàn)椴槐乜紤]維護(hù) .def 文件和獲取導(dǎo)出函數(shù)的修飾名。例如,如果您設(shè)計(jì)的 DLL 供自己控制的應(yīng)用程序使用,則此方法很適用。如果通過(guò)新的導(dǎo)出函數(shù)重新生成 DLL,還必須重新生成應(yīng)用程序,因?yàn)槿绻褂貌煌姹镜木幾g器進(jìn)行重新編譯,則導(dǎo)出的 C++ 函數(shù)的修飾名可能會(huì)發(fā)生變化。