호스트 응용 프로그램의 STL 컨테이너에 저장된 데이터에 액세스해야하는 DLL이 있습니다. C++에는 표준 ABI가없고 여러 컴파일러를 지원하기 때문에 응용 프로그램과 DLL 간의 인터페이스는 기본적으로 평범한 데이터로 남아 있어야합니다.DLL 경계를 통해 STL 목록을 노출하는 방법은 무엇입니까?
벡터의 경우 이것은 비교적 간단합니다. 이 contigious이 보장되기 때문에 당신은 단순히 벡터의 메모리 블록을 반환 할 수 있습니다
// 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() 인터페이스에 의존해야합니까? 많은 목록에 대해이 작업을 수행해야 할 수도 있으므로 벡터와 같은 간단한 솔루션을 갖는 것이 좋을 것입니다.
모든 컴파일 설정이 동일하다면 빠져 나갈 수 있습니다. 하지만 이것은 플러그인 아키텍처를위한 것이며 다른 컴파일러를 지원하고 싶습니다. 나는 이것을 명확히하기 위해 질문을 편집했다. – AshleysBrain
필자는 이것에 동의하지만 어쩌면 레이아웃뿐 아니라 새로운 컴파일러와 같은 메소드의 구현이 일치하도록 코드를 컴파일해야합니다. –
빌드 설정/컴파일러 버전을 엄격하게 적용하고 모든 것이 사용자의 통제하에 있다면 정적 라이브러리를 사용하고 모든 것을 하나의 실행 파일로 연결하는 것보다 DLL의 장점은 무엇입니까? –