Regole e limitazioni per dllimport/dllexportRules and Limitations for dllimport/dllexport

Sezione specifica MicrosoftMicrosoft Specific

  • Se si dichiara una funzione senza l'attributo dllimport o dllexport, la funzione non viene considerata parte dell'interfaccia DLL.If you declare a function without the dllimport or dllexport attribute, the function is not considered part of the DLL interface. Di conseguenza, la definizione della funzione deve essere presente in tale modulo o in un altro modulo dello stesso programma.Therefore, the definition of the function must be present in that module or in another module of the same program. Per rendere la funzione parte dell'interfaccia DLL, è necessario dichiararne la definizione nell'altro modulo come dllexport.To make the function part of the DLL interface, you must declare the definition of the function in the other module as dllexport. In caso contrario, durante la compilazione del client verrà generato un errore del linker.Otherwise, a linker error is generated when the client is built.

  • Se le dichiarazioni dllimport e dllexport per la stessa funzione si trovano nello stesso modulo del programma, l'attributo dllexport ha la precedenza sull'attributo dllimport.If a single module in your program contains dllimport and dllexport declarations for the same function, the dllexport attribute takes precedence over the dllimport attribute. Viene tuttavia generato un avviso del compilatore.However, a compiler warning is generated. Ad esempio:For example:

    #define DllImport   __declspec( dllimport )  
    #define DllExport   __declspec( dllexport )  
    
       DllImport void func1( void );  
       DllExport void func1( void );   /* Warning; dllexport */  
                                       /* takes precedence. */  
    
  • Non è possibile inizializzare un puntatore a dati statico con l'indirizzo di un oggetto dati dichiarato con l'attributo dllimport.You cannot initialize a static data pointer with the address of a data object declared with the dllimport attribute. Il codice seguente genera ad esempio errori:For example, the following code generates errors:

    #define DllImport   __declspec( dllimport )  
    #define DllExport   __declspec( dllexport )  
    
       DllImport int i;  
       .  
       .  
       .  
       int *pi = &i;                           /* Error */  
    
       void func2()  
       {  
          static int *pi = &i;                   /* Error */  
       }  
    
  • Se si inizializza un puntatore a una funzione statico con l'indirizzo di una funzione dichiarata con dllimport, il puntatore verrà impostato sull'indirizzo del thunk di importazione della DLL (uno stub di codice che trasferisce il controllo alla funzione) anziché sull'indirizzo della funzione.Initializing a static function pointer with the address of a function declared with dllimport sets the pointer to the address of the DLL import thunk (a code stub that transfers control to the function) rather than the address of the function. Questa assegnazione non genera un messaggio di errore:This assignment does not generate an error message:

    #define DllImport   __declspec( dllimport )  
    #define DllExport   __declspec( dllexport )  
    
       DllImport void func1( void   
       .  
       .  
       .  
       static void ( *pf )( void ) = &func1;   /* No Error */  
    
       void func2()  
       {  
          static void ( *pf )( void ) = &func1;  /* No Error */  
       }  
    
  • Poiché un programma che include l'attributo dllexport nella dichiarazione di un oggetto deve fornire la definizione di tale oggetto, è possibile inizializzare un puntatore a funzione statico globale o locale con l'indirizzo di una funzione dllexport.Because a program that includes the dllexport attribute in the declaration of an object must provide the definition for that object, you can initialize a global or local static function pointer with the address of a dllexport function. Analogamente, è possibile inizializzare un puntatore a dati statico globale o locale con l'indirizzo di un oggetto dati dllexport.Similarly, you can initialize a global or local static data pointer with the address of a dllexport data object. Ad esempio:For example:

    #define DllImport   __declspec( dllimport )  
    #define DllExport   __declspec( dllexport )  
    
       DllImport void func1( void );  
       DllImport int i;  
    
       DllExport void func1( void );  
       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 */  
       }  
    

    Fine sezione specifica MicrosoftEND Microsoft Specific

Vedere ancheSee Also

Funzioni di importazione ed esportazione di DLLDLL Import and Export Functions