__declspec(dllexport)와declspec(dllimport)

구별
       그들 은 모두 내 보 내 고 가 져 오 는 DLL 의 키워드 입 니 다.DLL 내부 의 클래스 와 함수,데 이 터 를 내 보 내 고 가 져 올 때 사용 합 니 다.
      dllexport 는 이러한 종류,함수,데이터 의 설명 을 할 때 사용 합 니 다.이 물건 들 이 외부 함수 에 의 해 사 용 될 수 있다 는 것 을 그 가 보 여 준다.즉,(dllexport)는 DLL 의 관련 코드(클래스,함수,데이터)를 다른 프로그램 에 노출 시 켜 사용 하 는 것 이다.(dllexport)키 워드 를 사 용 했 습 니 다.(dllexport)키워드 뒤에 이 어 진 관련 내용 은 다른 프로그램 에 사용 할 수 있 음 을 밝 힌 셈 입 니 다.
      dllimport 는 외부 프로그램 이 DLL 내 관련 내용 을 사용 해 야 할 때 사용 하 는 키워드 입 니 다.외부 프로그램 이 DLL 내부 코드(클래스,함수,전역 변수)를 사용 하려 면 프로그램 내부 에서(dllimport)키워드 성명 에 사용 할 코드 만 사용 하면 됩 니 다.즉,(dllimport)키 워드 는 외부 프로그램 이 DLL 내부 관련 내용 을 사용 해 야 할 때 만 사용 합 니 다.(dllimport)는 DLL 의 관련 코드 를 응용 프로그램 에 삽입 하 는 역할 을 합 니 다.
      _declspec(dllexport)와declspec(dllimport)는 서로 호응 합 니 다.DLL 내부 에서 dllexport 로 설명 을 해 야 외부 함수 에서 dllimport 로 관련 코드 를 가 져 올 수 있 습 니 다.
흔 한 용법
    편리 하 게 사용 하기 위해 서,우 리 는 항상 코드 에서 매크로 DLL 을 정의 합 니 다.EXPORT,이 매크로 는 내 보 낼 클래스 와 함수 앞 에 사 용 됩 니 다.이 매크로 는 다음 과 같이 정의 합 니 다.
#ifdef DLL_EXPORTS

      #define SIMPLE_CLASS_EXPORT __declspec(dllexport)

#else

       #define SIMPLE_CLASS_EXPORT __declspec(dllimport)

#endif

    동적 라 이브 러 리 로 서 내 보 낼 클래스 나 함수 전에 키워드 를 사용 해 야 합 니 다.declspec(dllexport)성명 이 므 로 동적 라 이브 러 리 는 매크로 DLL 을 정의 해 야 합 니 다.EXPORTS(Vistualstudio 를 사용 하여 동적 라 이브 러 리 프로젝트 를 만 들 때 이 매크로 는 정의 되 었 습 니 다).
    응용 프로그램 은 키워드 를 사용 해 야 합 니 다.declspec(dllimport),따라서 매크로 DLL 을 정의 할 수 없습니다.EXPORTS。
dllimport 를 생략 할 수 있 습 니까??
       하지만 MSDN 문서 에 서 는declspec(dllimport)의 설명 은 좀 이상 하 다.먼저 MSDN 에서 어떻게 말 하 는 지 살 펴 보 자.
          사용 하지 않 음declspec(dllimport)도 코드 를 정확하게 컴 파일 할 수 있 지만 를 사용 합 니 다.declspec(dllimport)는 컴 파일 러 가 더 좋 은 코드 를 만 들 수 있 도록 합 니 다.컴 파일 러 가 더 좋 은 코드 를 만 들 수 있 는 이 유 는 함수 가 DLL 에 존재 하 는 지 확인 할 수 있 기 때문에 컴 파일 러 는 간접 주소 지정 단 계 를 뛰 어 넘 는 코드 를 만 들 수 있 고 이 코드 들 은 보통 DLL 경 계 를 뛰 어 넘 는 함수 호출 에 나타난다.하지만 를 사용 해 야 합 니 다.declspec(dllimport)에서 만 DLL 에서 사용 할 변 수 를 가 져 올 수 있 습 니 다.
      사용declspec(dllimport)는 더 좋 은 코드 를 만 들 수 있다 는 점 은 이해 하기 쉽 지만,이 를 사용 해야만 dll 의 변 수 를 내 보 낼 수 있 습 니 다.정말 그렇습니까?그럼 테스트 해 보 겠 습 니 다.
      동적 라 이브 러 리 를 만 듭 니 다.Simple Class.h 와 Simple Class.cpp 로 구성 되 어 있 으 며 Simple Class.h 의 코드 는 다음 과 같 습 니 다.
//file  SimpleClass.h
#ifndef _SIMPLE_CLASS_H_
#define _SIMPLE_CLASS_H_

#ifdef DLL_EXPORTS
    #define SIMPLE_CLASS_EXPORT__declspec(dllexport)
#else
    #define SIMPLE_CLASS_EXPORT
#endif

extern int SIMPLE_CLASS_EXPORT g_Vaule; //    

class SIMPLE_CLASS_EXPORT CSimpleClass
{
public:
    CSimpleClass(void);
    ~CSimpleClass(void);
     int GetVale(void)const;
};
#endif

SimpleClass.cpp 코드 는 다음 과 같 습 니 다.
//SimpleClass.cpp

#include "SimpleClass.h"

int g_Vaule = 100;

CSimpleClass::CSimpleClass(void)
    :m_iValue(100)
{}
CSimpleClass::~CSimpleClass(void)
{}
int CSimpleClass::GetVale(void)const
{
    return g_Vaule;
}

    응용 프로그램 에서 g 를 직접 사용 하지 않 으 면Vaule,순조롭게 컴 파일 통과 할 수 있 고 함수 GetVale 를 호출 하면 100 을 정확하게 되 돌 릴 수 있 습 니 다.
    하지만 응용 프로그램 에서 g 를 직접 사용 하면Vaule,컴 파일 오류 알림 은 다음 과 같 습 니 다.
1>main.obj : error LNK2001: unresolvedexternal symbol "int g_Vaule" (?g_Vaule@@3HA)
   
    Simple Class.h 의 매크로 정 의 를 아래 값 으로 변경 하면 컴 파일 에 성공 합 니 다:
#ifdef DLL_EXPORTS
      #define SIMPLE_CLASS_EXPORT __declspec(dllexport)
#else
      #define SIMPLE_CLASS_EXPORT __declspec(dllimport)
#endif

   
     요약:동적 라 이브 러 리 자체 에 키 워드 를 사용 해 야 합 니 다declspec(dllexport),응용 프로그램 에 대해 동적 라 이브 러 리 에서 내 보 낸 변 수 를 사용 하지 않 으 면 키워드 를 사용 하지 않 습 니 다.declspec(dllimport)도 동적 라 이브 러 리 의 정상 적 인 사용 을 보장 할 수 있 지만,실제 사용 중 에는 프로그램 에서 키 워드 를 사용 하 는 것 을 권장 합 니 다declspec(dllimport),구체 적 인 원인 은 위의 MSDN 의 말 입 니 다.
 동적 라 이브 러 리 와 정적 라 이브 러 리 가 병존 합 니 다.
    또한,때때로 우리 프로그램 은 동적 라 이브 러 리 와 정적 라 이브 러 리 를 동시에 제공 해 야 하 며,모두 헤더 파일 을 사용 해 야 합 니 다.키워드 의 사용 충돌 을 해결 하기 위해 다음 과 같은 매크로 정 의 를 사용 하 는 것 을 권장 합 니 다.
#ifdefined DLL_EXPORTS
    #ifdefined INSIDE_DLL
         #define SIMPLE_CLASS_EXPORT__declspec(dllexport)
    #else
        #define SIMPLE_CLASS_EXPORT__declspec(dllimport)
    #endif
#else
      #define SIMPLE_CLASS_EXPORT
#endif

동적 라 이브 러 리 자체 에 대해 매크로 DLL 을 정의 해 야 합 니 다.EXPORTS 와 INSIDEDLL 동적 라 이브 러 리 를 사용 하 는 응용 프로그램 정의 매크로 DLLEXPORTS
정적 라 이브 러 리 에 대해 서 는 DLL 을 정의 할 필요 가 없습니다.EXPORTS,물론 정적 라 이브 러 리 의 응용 프로그램 도 정의 할 필요 가 없습니다.
이렇게 정의 하면 동적 라 이브 러 리 와 정적 라 이브 러 리 내 보 내기 가 같은 헤더 파일 을 사용 할 수 있 습 니 다.
참조 링크:http://wenku.baidu.com/view/f9d8613510661ed9ad51f3ff.html

좋은 웹페이지 즐겨찾기