共用方式為


使用 C++ 類別] 中 dllimport 和 dllexport

Microsoft 專有的

您可以宣告具有 C++ 類別 dllimport 或dllexport屬性。 這些表單表示整個類別是匯入或匯出。 匯出這種方式的類別稱為可匯出的類別。

下列範例會定義可匯出的類別。 正在匯出其所有的成員函式和靜態資料:

#define DllExport   __declspec( dllexport )

class DllExport C {
   int i;
   virtual int func( void ) { return 1; }
};

請注意,明確使用 dllimport 和dllexport上可匯出的類別的成員屬性禁止。

dllexport 類別

當您宣告類別dllexport,會匯出其所有的成員函式和靜態資料成員。 您必須提供的相同程式中的所有這類成員的定義。 否則,就會產生連結器錯誤。 這項規則的唯一例外適用於純虛擬函式,您不需要為其提供明確的定義。 但是,抽象類別解構函式一定會呼叫基底類別的解構函式,因為純虛擬的解構函式必須永遠會提供定義。 請注意這些規則也適用於 nonexportable 的類別。

如果您匯出的類別型別或函式會傳回類別的資料,請務必將這個類別匯出。

dllimport 類別

當您宣告類別 dllimport,其所有的成員函式和靜態資料成員會匯入。 不同的行為 dllimport 和dllexport nonclass 型別,靜態資料成員不能在同一個程式中指定的定義 dllimport 類別定義。

繼承和可匯出的類別

所有的可匯出的基底類別必須是類別的可匯出。 否則,會產生編譯器警告。 此外,也是類別的所有可存取成員必須是可匯出。 此規則允許dllexport類別以便加以繼承 dllimport 類別,以及 dllimport 類別以便加以繼承dllexport類別 (不過後者則不建議使用)。 一般而言,(根據以 C++ 的存取規則) 的 DLL 的用戶端可以存取的所有項目應該是介面的可匯出的一部分。 這包括了內嵌函式中所參考的私用資料成員。

選擇性成員匯入/匯出

因為成員函式和靜態類別內的資料隱含有外部連結,您可以宣告它們的 dllimport 或dllexport屬性,除非要匯出整個類別。 如果匯入或匯出,明確宣告的成員函式和資料當做整個類別 dllimport 或dllexport反之則禁止使用。 如果您將宣告為類別定義中的靜態資料成員dllexport,定義內必須進行某處相同的程式 (就跟 nonclass 外部連結)。

同樣地,您可以宣告成員函式與 dllimport 或dllexport屬性。 如此一來,您必須提供dllexport在相同程式中的某處的定義。

值得注意的是關於選擇性成員匯入及匯出的幾個重點:

  • 選擇性成員匯入/匯出適用於提供更嚴格的 ; 匯出的類別介面版本 也就是其中一個,您可以設計公開 (expose) 較少的公用和私用功能與語言的 DLL 否則即可。 也很適合微調可匯出的介面: 當您知道用戶端,根據定義,便無法存取一些私用的資料,您不需要匯出整個類別。

  • 如果您匯出一個類別中的虛擬函式時,您必須匯出所有的程式,或至少提供用戶端可以直接使用的版本。

  • 如果您要在此使用的虛擬函式的選擇性成員匯入/匯出的類別,該函式必須是可匯出的介面中,或定義都內嵌 (會顯示給用戶端)。

  • 如果您定義做為成員dllexport ,但不要加到類別定義中,就會產生編譯器錯誤。 您必須在類別標頭檔中定義的成員。

  • 雖然定義為類別成員的 dllimport 或dllexport是允許的您無法覆寫在類別定義中指定的介面。

  • 如果您是在宣告它的類別定義的主體以外的其他地方定義的成員函式,會產生警告,如果函式定義成dllexport或 dllimport (如果此定義不同的類別宣告中指定)。

請參閱

參考

dllexport dllimport