문제

호스트 애플리케이션의 STL 컨테이너에 저장된 데이터에 액세스 해야하는 DLL이 있습니다. C ++에는 표준 ABI가없고 다른 컴파일러를 지원하려고하므로 응용 프로그램과 DLL 간의 인터페이스는 기본적으로 평범한 기존 데이터를 유지해야합니다.

벡터의 경우 이것은 비교적 간단합니다. 벡터의 메모리 블록을 간단히 반환 할 수 있습니다.

// To return vector<int> data
virtual void GetVectorData(const int*& ptr, size_t& count) const
{
    if (!vec.empty())
        ptr = &(vec.front());

    count = vec.size();
}

이제 DLL은 해당 인터페이스를 통해 벡터의 데이터에 대한 안전한 읽기 전용 액세스를 가질 수 있습니다. DLL은 이것을 랩핑하여 내용물을 벡터 자체로 복사 할 수 있습니다.

그러나 STL 목록 (및 deques)은 어떻습니까? DLL 경계를 통해 액세스 할 수있는 또 다른 간단한 방법이 있습니까? 아니면 어떤 종류의 getfirst ()/getnext () 인터페이스에 의지해야합니까? 많은 목록을 위해이 작업을 수행해야 할 수도 있으므로 벡터만큼 간단한 솔루션을 갖는 것이 좋을 것입니다.

도움이 되었습니까?

해결책

아마도 당신은 "손잡이"와 같은 것을 목록/deque iterators로 전달할 수 있습니까? 이 핸들 유형은 불투명하고 사용자에게 배송 할 헤더 파일로 선언됩니다. 내부적으로 핸들 값을 목록/deque iterators에 매핑해야합니다. 기본적으로 사용자는 다음과 같은 코드를 작성합니다.

ListHandle lhi = GetListDataBegin();
const ListHandle lhe = GetListDataEnd();

while (lhi != lhe)
{
  int value = GetListItem(lhi);
  ...
  lhi = GetNextListItem(lhi);
}

다른 팁

각 STL 유형을 인스턴스화하는 위치에주의를 기울이면 DLL간에 STL 객체를 전달하고 다른 컴파일러를 지원할 수 있습니다. 지능적인 "dllexport"매크로가 필요합니다. 다음 세트를 사용하여 VC 및 GCC를 성공적으로 지원합니다.

#ifdef WIN32
#ifdef MYDLLLIB_EXPORTS      // DLL export macros
#define MYDLLLIB_API __declspec(dllexport)
#define MYDLLLIB_TEMPLATE
#else
#define MYDLLLIB_API __declspec(dllimport)
#define MYDLLLIB_TEMPLATE extern
#endif
#else                       // Not windows --- probably *nix/bsd
#define MYDLLLIB_API
#ifdef MYDLLLIB_EXPORTS
#define MYDLLLIB_TEMPLATE
#else
#define MYDLLLIB_TEMPLATE extern
#endif
#endif // WIN32

DLL을 컴파일 할 때 mydlllib_exports를 정의하십시오. DLL에서 사용하려는 각 STL 유형을 인스턴스화 할 수 있습니다. 예를 들어 문자열의 목록 또는 벡터

MYDLLLIB_TEMPLATE template class MYDLLLIB_API std::vector<std::string>;
MYDLLLIB_TEMPLATE template class MYDLLLIB_API std::list<std::string>;

DLL 소비자 (mydlllib_exports가 정의되지 않은 사람)는

extern template class __declspec(dllimport) std::vector<std::string>;

그리고 자신의 인스턴스화 대신 DLL에서 내보낸 이진 코드를 사용하십시오.

응용 프로그램과 DLL 사이의 인터페이스는 기본적으로 평범한 오래된 데이터를 유지해야합니다.

반드시 그런 것은 아닙니다. 동일한 컴파일러 버전이 사용되는지 확인해야합니다. 또한 STL 객체의 레이아웃에 영향을 미치는 빌드 설정은 DLL과 응용 프로그램간에 정확히 동일합니다.

DLL을 야생으로 풀어야한다면 DLL 경계에 걸쳐 STL을 노출시키는 데 관심이 있습니다. 그러나 모든 것이 귀하의 제어하에 있고 순전히 내부에 있다면 (또는 제 3 자 빌드 설정/컴파일러를 엄격하게 시행 할 수 있다면) 괜찮을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top