dllimport/dllexport에 대한 규칙 및 제한Rules and Limitations for dllimport/dllexport

Microsoft 전용Microsoft Specific

  • dllimport 또는 dllexport 특성을 포함하지 않고 선언하는 함수는 DLL 인터페이스의 일부분으로 간주되지 않습니다.If you declare a function without the dllimport or dllexport attribute, the function is not considered part of the DLL interface. 따라서 해당 모듈 또는 같은 프로그램의 다른 모듈에 함수 정의가 있어야 합니다.Therefore, the definition of the function must be present in that module or in another module of the same program. 함수를 DLL 인터페이스에 포함하려면 다른 모듈에서 함수의 정의를 dllexport로 선언해야 합니다.To make the function part of the DLL interface, you must declare the definition of the function in the other module as dllexport. 그러지 않으면 클라이언트를 빌드할 때 링커 오류가 발생합니다.Otherwise, a linker error is generated when the client is built.

  • 프로그램의 모듈 하나에 동일 함수에 대한 dllimportdllexport 선언이 포함되어 있으면 dllexport 특성이 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. 그러나 이 경우 컴파일러 경고가 생성됩니다.However, a compiler warning is generated. 예:For example:

    #define DllImport   __declspec( dllimport )  
    #define DllExport   __declspec( dllexport )  
    
       DllImport void func1( void );  
       DllExport void func1( void );   /* Warning; dllexport */  
                                       /* takes precedence. */  
    
  • dllimport 특성을 사용하여 선언된 데이터 개체의 주소로 정적 데이터 포인터를 초기화할 수는 없습니다.You cannot initialize a static data pointer with the address of a data object declared with the dllimport attribute. 예를 들어, 다음 코드는 오류를 생성합니다.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 */  
       }  
    
  • dllimport를 사용하여 선언된 함수의 주소로 정적 함수 포인터를 초기화하면 해당 포인터는 함수의 주소가 아닌 DLL 가져오기 썽크(컨트롤을 함수로 전송하는 코드 스텁)의 주소로 설정됩니다.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. 이 할당에서는 오류 메시지가 생성되지 않습니다.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 */  
       }  
    
  • 개체 선언에 dllexport 특성을 포함하는 프로그램은 해당 개체의 정의를 제공해야 하므로 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. 마찬가지로 dllexport 데이터 개체의 주소로 전역 또는 로컬 정적 데이터 포인터를 초기화할 수 있습니다.Similarly, you can initialize a global or local static data pointer with the address of a dllexport data object. 예: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 */  
       }  
    

    Microsoft 전용 종료END Microsoft Specific

참고 항목See Also

DLL 가져오기 및 내보내기 함수DLL Import and Export Functions