Dllimport 및 >dllexport에서 C++ 클래스를 사용합니다.
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 클래스 (두 번째 방법을 권장 되지 않습니다 있지만).일반적으로 DLL의 클라이언트 (액세스 규칙을 C++)를 기준으로 액세스할 수 있는 모든 것 내보낼 수 있는 인터페이스 여야 합니다.인라인 함수에서 참조 하는 전용 데이터 멤버를 포함 합니다.
선택적 멤버 가져오기/내보내기
암시적 멤버 함수와 정적 데이터는 클래스 내에서 외부 링크를 사용 하기 때문에 선언할 수는 dllimport 또는 dllexport 전체 클래스를 내보내지 않는 특성.전체 클래스를 가져오거나 내보낼, 멤버 함수 및 데이터를 명시적으로 선언 하는 경우 dllimport 또는 dllexport 허용 되지 않습니다.정적 데이터 멤버는 클래스 정의 내에서 선언 하는 경우 dllexport, 정의 어딘가에 프로그램 내 (nonclass 외부 링크 처럼) 발생 해야 합니다.
마찬가지로, 멤버 함수를 선언할 수 있습니다의 dllimport 또는 dllexport 특성입니다.제공 해야 합니다이 경우에 dllexport 어딘가에 동일한 프로그램 내에서 정의 됩니다.
선택적 멤버 가져오기 및 내보내기에 대 한 몇 가지 중요 한 포인트를 확인 하는 것이 좋습니다.
선택적 멤버 가져오기/내보내기 버전 보다 제한적인 내보낸된 클래스 인터페이스를 제공 하는 데 가장 많이 사용 됩니다. 즉, 한 언어 보다 적은 공용 및 전용 기능을 노출 하는 DLL을 디자인할 수 있습니다 그렇지 수 있습니다.내보낼 수 있는 인터페이스를 미세 조정에 대 한 유용한 것: 클라이언트, 정의 의해 몇 가지 개인 데이터에 액세스할 수 없는 경우 전체 클래스를 내보내는 해야 합니다.
클래스에서 가상 함수를 내보내는 경우 내보내기를 하거나 적어도 클라이언트가 직접 사용할 수 있는 버전을 제공 해야 합니다.
선택적 멤버 가져오기/내보내기 가상 함수에 사용 되는 클래스의 경우 함수 또는 인라인 (클라이언트에 게 표시)를 정의 합니다. 내보낼 수 있는 인터페이스에서 같아야 합니다.
구성원으로 정의 하는 경우 dllexport 클래스 정의에 포함 되지 않습니다 하지만 컴파일러 오류가 생성 됩니다.클래스 헤더에 해당 멤버를 정의 해야 합니다.
하지만 클래스 멤버의 정의 dllimport 또는 dllexport 입니다 허용, 클래스 정의에서 지정 된 인터페이스를 재정의할 수 없습니다.
멤버 함수를 선언한 그는 클래스 정의의 본문 이외의 다른 곳에서 정의 하는 경우 함수 이름으로 정의 된 경우 경고가 생성 됩니다 dllexport 또는 dllimport (다르면이 정의를 클래스 선언에 지정).