[c++] 개체, 특히 STL 개체를 DLL간에 안전하게 전달하는 방법은 무엇입니까?



Answers

@computerfreaker는 유형 정의가 사용자 제어하에 있고 두 프로그램 모두에서 정확히 동일한 토큰 시퀀스가 ​​사용되는 경우에도 일반적으로 DLL 경계를 넘어 C ++ 객체를 전달하지 못하게하는 이유에 대한 훌륭한 설명을 작성했습니다. (표준 레이아웃 클래스와 순수한 인터페이스가 작동하는 두 가지 경우가 있습니다)

C ++ 표준에 정의 된 객체 유형 (표준 템플릿 라이브러리에서 채택 된 객체 유형 포함)의 경우 상황이 훨씬 더 심각합니다. 이러한 유형을 정의하는 토큰은 여러 컴파일러에서 동일하지 않습니다. C ++ 표준은 완전한 유형 정의를 제공하지 않으며 최소 요구 사항 만 제공합니다. 또한 이러한 형식 정의에 나타나는 식별자의 이름 조회는 동일하게 해결되지 않습니다. C ++ ABI가있는 시스템에서도 모듈 경계를 넘어 이러한 유형을 공유하려고하면 One Definition Rule 위반으로 인해 정의되지 않은 거대한 동작이 발생합니다.

g ++의 libstdc ++는 사실상의 표준이었고 사실상 모든 프로그램이이를 사용하여 ODR을 만족 시켰기 때문에 Linux 프로그래머는 익숙하지 않았습니다. clang의 libc ++가 그 가정을 깨뜨린 다음 C ++ 11은 거의 모든 표준 라이브러리 유형에 대한 필수 변경 사항을 따라 왔습니다.

모듈간에 표준 라이브러리 유형을 공유하지 마십시오. 정의되지 않은 동작입니다.

Question

클래스 개체, 특히 STL 개체를 C ++ DLL과주고 받기 위해서는 어떻게해야합니까?

내 응용 프로그램은 DLL 파일의 형태로 타사 플러그인과 상호 작용해야하며 이러한 플러그인이 빌드되는 컴파일러를 제어 할 수 없습니다. 나는 STL 객체에 대해 보장 된 ABI가 없다는 것을 알고 있으며, 나는 나의 애플리케이션에서 불안정성을 야기하는 것에 우려하고있다.




모든 모듈 (.EXE 및 .DLL)이 동일한 C ++ 컴파일러 버전과 CRT의 동일한 설정 및 맛을 사용하여 빌드 된 경우가 아니면 DLL 경계를 넘어 STL 개체를 안전하게 전달할 수 없습니다. 이는 매우 제한적이며 명확하지 않습니다.

DLL에서 객체 지향 인터페이스를 노출하려면 C ++ 순수 인터페이스 (COM과 유사)를 노출해야합니다. CodeProject에서이 흥미로운 기사를 읽는 것을 고려하십시오.

HowTo : DLL에서 C ++ 클래스 내보내기

또한 DLL 경계에서 순수 C 인터페이스를 노출 한 다음 호출자 사이트에서 C ++ 랩퍼를 빌드하는 것이 좋습니다.
이는 Win32에서 발생하는 것과 비슷합니다. Win32 구현 코드는 거의 C ++이지만 많은 Win32 API가 순수한 C 인터페이스를 노출합니다 (COM 인터페이스를 노출하는 API도 있음). 그런 다음 ATL / WTL 및 MFC는 이러한 순수 C 인터페이스를 C ++ 클래스 및 개체로 래핑합니다.




Links