決定要使用哪一個匯出方法
若要決定使用哪一個方法來匯出函式 (.def 檔或 __declspec(dllexport) 關鍵字),請先考慮下列問題:
您會繼續加入其他的匯出函式嗎?
誰會使用您的 DLL 呢? 例如,是否為協力廠商的 DLL,由許多您無法重建的可執行檔使用,還是 DLL 僅由您可以方便地重建的應用程式所使用呢?
使用 .DEF 檔的優缺點
在 .def 檔裡匯出函式,可以讓您控制匯出序數。 您可在將其他匯出函式加入至 DLL 時,將較高的序數值 (比其他的匯出函式高) 指派給它們。 當您這樣做時,使用隱含連結的應用程式就不需要重新連結包含新函式的新匯入程式庫。 這點相當重要,例如,在設計許多應用程式可使用的協力廠商 DLL 時。 您可以加入其他功能來繼續加強 DLL,同時確保現有應用程式會繼續適當地使用新的 DLL。 MFC DLL 是使用 .def 檔建置的。
使用 .def 檔的另一項優點是,您可以使用 NONAME 屬性匯出函式,此屬性會在 DLL 的匯出表中只放置序數。 對於具大量匯出函式的 DLL,使用 NONAME 屬性可以降低 DLL 檔的大小。 如需撰寫模組定義陳述式的詳細資訊,請參閱模組定義陳述式的規則。 如需序數匯出的詳細資訊,請參閱根據序數而不是名稱從 DLL 匯出函式。
使用 .def 檔的主要缺點是,如果要匯出 C++ 檔中的函式,則必須在 .def 檔中放置裝飾名稱 (Decorated Name),或是使用 extern "C",以標準 C 連結來定義匯出的函式,避免編譯器 (Compiler) 所做的名稱裝飾。
如果您需要在 .def 檔中放置裝飾名稱,您可以使用 DUMPBIN 工具或使用連結器 (Linker) 的 /MAP 選項取得裝飾名稱。 請注意,由編譯器產生的裝飾名稱是編譯器特定的。 如果您將 Visual C++ 編譯器所產生的裝飾名稱置於 .def 檔,連結至您的 DLL 的應用程式也必須使用相同版本的 Visual C++ 來建置,這樣在呼叫的應用程式中裝飾名稱才會符合 DLL 的 .def 檔中匯出的名稱。
使用 __declspec(dllexport) 的優缺點
使用 __declspec(dllexport) 很方便,因為您不必花費心思維護 .def 檔和取得匯出之函式的裝飾名稱。 例如,這個方式在設計 DLL 供您可以控制的應用程式使用時很適合。 如果您使用新的匯出重建 DLL,您也必須重建應用程式,因為匯出之 C++ 函式的裝飾名稱,在您使用不同版本的編譯器重新編譯時可能會改變。