共用方式為


一般規則與限制

Microsoft 專有的

  • 如果您宣告函式或物件沒有 dllimport 或dllexport屬性、 函數或物件不被視為 DLL 介面的一部分。 因此,您必須是存在於該模組中,或在同一個程式的另一個模組中定義的函式或物件。 若要讓 DLL 介面的函式或物件的部分,您必須宣告函式或物件為其他模組中的定義的dllexport。 否則,就會產生連結器錯誤。

    如果您宣告函式,或使用dllexport屬性,其定義必須出現在相同程式的某些模組。 否則,就會產生連結器錯誤。

  • 如果一個單獨的模組,在您的程式中同時包含 dllimport 和dllexport宣告相同的函式或物件, dllexport屬性會優先於 dllimport 屬性。 不過,會產生編譯器警告。 例如:

    __declspec( dllimport ) int i;
    __declspec( dllexport ) int i;   // Warning; inconsistent;
                                     // dllexport takes precedence.
    
  • C + + 中,您可以初始化全域宣告或靜態區域資料指標或位址為宣告的資料物件的 dllimport c 會產生錯誤的屬性 此外,您可以初始化靜態本機的函式指標以宣告的函式的位址 dllimport 屬性。 在 c 中,這種指派會設定至 DLL 的匯入 thunk (將控制轉移到函式的程式碼 stub) 的位址指標,而不是函式的位址。 C + + 中,它會設定指標的函式的位址。 例如:

    __declspec( dllimport ) void func1( void );
    __declspec( dllimport ) int i;
    
    int *pi = &i;                             // Error in C
    static void ( *pf )( void ) = &func1;     // Address of thunk in C,
                                              // function in C++
    
    void func2()
    {
       static int *pi = &i;                  // Error in C
       static void ( *pf )( void ) = &func1; // Address of thunk in C,
                                             // function in C++
    }
    

    不過,因為其中包含程式dllexport屬性宣告中的物件必須提供該程式中的某處的物件的定義,您可以初始化全域或區域的靜態函式指標位址為dllexport函式。 同樣地,您可以初始化全域或區域的靜態資料指標位址為dllexport資料物件。 例如,下列程式碼不會產生 c 或 C++ 中的錯誤:

    __declspec( dllexport ) void func1( void );
    __declspec( dllexport ) int i;
    
    int *pi = &i;                              // Okay
    static void ( *pf )( void ) = &func1;      // Okay
    
    void func2()
    {
        static int *pi = &i;                   // Okay
        static void ( *pf )( void ) = &func1;  // Okay
    }
    
  • 因的行為變更之一介紹 Visual C++。NET 進行應用程式的dllexport更具有一致性規則的類別和類別樣板之特製化之間如果您要套用dllexport未標記為基底類別的一般類別到dllexport,編譯器會產生 C4275。

    如果基底類別的類別樣板特製化,編譯器就會產生相同的警告。 若要解決這個問題,將標記與基底類別dllexport。 在類別樣板特製化的問題在於要放置的地方 __declspec(dllexport)。 不允許您將類別樣板的標記。 相反地,明確具現化類別樣板和將標記與這個明確具現化dllexport。 例如:

    template class __declspec(dllexport) B<int>;
    class __declspec(dllexport) D : public B<int> {
    // ...
    

    如果樣板引數是衍生的類別,則此因應措施會失敗。 例如:

    class __declspec(dllexport) D : public B<D> {
    // ...
    

    因為這是使用樣板的常見模式時,編譯器就會變更的語意dllexport它適用於具有一或多個基底類別的類別,並至少有一個基底類別是在類別樣板特製化。 在此情況下,編譯器隱含地套用dllexport來的類別樣板特製化。 在 Visual C++。NET 中,使用者可以執行下列作業,不出現警告訊息:

    class __declspec(dllexport) D : public B<D> {
    // ...
    

請參閱

參考

dllexport dllimport