Aracılığıyla paylaş


Genel Kurallar ve Sınırlamalar

Microsoft'a Özgü

  • Bir işlev bildirmenin ya da olmadan nesne DllImport veya dllexport özniteliği, işlevi veya nesne DLL arabiriminin parçası dikkate alınmaz.Bu nedenle, işlev veya nesne tanımı bu modül içinde veya aynı programın başka bir modül içinde bulunması gerekir.Arabirimi DLL işlevi veya nesnenin parçası haline getirmek için işlevi veya bir modül olarak nesne tanımına bildirmek dllexport.Aksi halde bir bağlayıcı hatası meydana gelir.

    Bir işlev bildirimini veya nesnesi ile dllexport özniteliğini, aynı programın bazı modülünde tanımına yer almalıdır.Aksi halde bir bağlayıcı hatası meydana gelir.

  • Her ikisi de tek bir modül programınızda içeriyorsa, DllImport ve dllexport aynı işlevi veya nesne için bildirimleri dllexport özniteliği önceliklidir DllImport özniteliği.Ancak, derleyici uyarısı oluşturulur.Örne?in:

    __declspec( dllimport ) int i;
    __declspec( dllexport ) int i;   // Warning; inconsistent;
                                     // dllexport takes precedence.
    
  • C++'da, genel olarak bildirilen veya statik yerel veri işaretçisi başlatılamıyor veya adresi ile bildirilen veri nesnesi ile DllImport c dilinde bir hata üretir özniteliğiAyrıca, bir statik yerel işlev işaretçisi ile bildirilen bir işlev adresi başlatabilir DllImport özniteliği.C, böyle bir atama işlev adresi işaretçi adresi DLL içe aktarma dönüştürücü (denetim işlevi için transfer eden bir kod Saplaması) olarak ayarlar.C++'da, işaretçiyi işlevin adresini ayarlar.Örne?in:

    __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++
    }
    

    Ancak, bir programı içerdiğinden dllexport adresi ile bir genel veya yerel statik işlev işaretçisi başlatabilir, nesne bildirimi özniteliğinde program içinde bir yerde o nesnenin tanımını sağlamalıdır bir dllexport işlev.Benzer şekilde, bir genel veya yerel statik verileri işaretçi adresi ile başlatabilir bir dllexport veri nesnesi.Örneğin, C ya da C++ aşağıdaki kod hata oluşturmaz:

    __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
    }
    
  • Davranış değişikliği nedeniyle Visual C++ uygulamasını sağlamak için .NET ile tanıştırmak dllexport daha tutarlı normal sınıflar ve sınıf şablonları uzmanlıklar arasında uygularsanız, dllexport olarak işaretlenmemiş bir temel sınıf olan normal sınıf dllexport, derleyici C4275 oluşturur.

    Temel sınıf sınıf şablonunun bir uzmanlığı ise derleyici aynı uyarı oluşturur.Bu sorunu çözmek için temel sınıf ile işaretle dllexport.Sınıf şablonu bir uzmanlığı nereye sorundur __declspec(dllexport); sınıf şablonu işaretlemek için izin verilmez.Bunun yerine, açıkça sınıf şablon oluşturma ve bu açık örnekleme ile işaretle dllexport.Örne?in:

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

    Türetme sınıfı şablon bağımsız değişken ise, bu geçici çözümü başarısız olur.Örne?in:

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

    Bu şablonları ile ortak desen olduğundan, derleyici semantiği değiştirildi dllexport bir veya daha fazla temel sınıfları bir sınıfa uygulandığında ve bir veya daha fazla temel sınıflar uzmanlığı sınıf şablonu olduğunda.Bu durumda, derleyici örtülü olarak uygulanan dllexport uzmanlıklar sınıf şablonları için.Visual C++ .NET kullanıcı aşağıdakileri yapın ve bir uyarı alıyorum değil:

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

Ayrıca bkz.

Başvuru

dllexport, dllimport