決定要使用哪一個匯出方法
您可以使用兩種方式匯出檔案:.def 檔或 __declspec(dllexport)
關鍵字。 為了協助您決定針對您的 DLL 使用哪種方式較好,請考慮下列問題:
您打算稍後要匯出多個函式嗎?
您的 DLL 只由您可以重建的應用程式所使用,或是由您無法重建的應用程式所使用 (例如,由協力廠商所建立的應用程式)?
使用 .def 檔的優缺點
在 .def 檔裡匯出函式,可以讓您控制匯出序數。 當您將匯出函式加入至 DLL 時,可以將較高的序數值 (比其他的匯出函式高) 指派給它們。 當您這樣做時,使用隱含連結的應用程式就不需要重新連結包含新函式的匯入程式庫。 如果您正在設計可供多個應用程式使用的 DLL,這會很方便,因為您可以加入新的功能,也可確保它繼續與已倚賴它的應用程式一起正常運作。 例如,使用 .def 檔建立 MFC DLL。
使用 .def 檔的另一個優點是您可以使用 NONAME
屬性來匯出函式。 這麼做只會將序數放在 DLL 的匯出表中。 對於具有大量匯出函式的 DLL,使用 NONAME
屬性可以降低 DLL 檔的大小。 如需如何撰寫模組定義語句的資訊,請參閱 Module-Definition 語句 的規則。 如需序數匯出的相關資訊,請參閱 依序數而非依名稱 從 DLL 匯出函式。
使用 .def 檔案的缺點是,如果您要在 C++ 檔案中匯出函式,您必須將裝飾名稱放在 .def 檔案中,或使用 extern 「C」 來定義匯出的函式,以避免 MSVC 編譯器完成的名稱裝飾。
如果您將裝飾名稱放在 .def 檔案中,您可以使用 DUMPBIN 工具或使用連結器 /MAP 選項來取得它們 。 由編譯起產生的裝飾名稱是編譯器特有的名稱,因此如果您將編譯器產生的裝飾名稱放入 .def 檔案中,連結 DLL 的應用程式必須也是使用相同版本的編譯器建置,以便所呼叫應用程式中的裝飾名稱與 DLL 的 .def 檔案中的輸出名稱相符。
使用 __declspec 的優缺點(dllexport)
使用 __declspec(dllexport)
很方便,因為您不必花費心思在維護 .def 檔和取得匯出函式的裝飾名稱上。 不過,這種匯出方法的用處會受限於您願意重建連結應用程式的數目。 如果您使用新的匯出重建 DLL,您也必須重建應用程式,因為匯出 C++ 函式的裝飾名稱,在您使用不同版本的編譯器重建它時可能會變更。