우리는 인터페이스 클래스DLL 내보내기 및 가상 메소드 윈도우 프로젝트에서
class Interface {
public:
virtual ~Interface() { }
virtual void func() = 0;
};
과 DLL 내부의 공장 기능
__declspec(dllexport) Interface *construct();
을 정의합니다. 물론 Interface
의 구체적인 전문화가 DLL 내에 있지만 우리는 그것을 내 보내지 않습니다. 그럼에도 불구하고 DLL 외부에서 사용할 수 있습니다. 이게 어떻게 작동합니까? construct()
에 의해 생성 된 인스턴스의 vftable
은 DLL에서 내 보내지 않은 함수 포인터 대상 함수로 구성됩니다. 이 접근 방식을 수용 할 수 있습니까?
그래서 COM이 공장 기능을 제외한 모든 것을 내 보내지 않으면 너무 많이 받아 들여야합니다. – phlipsy
그리고 v-table의 레이아웃은'Interface'를 정의하는 공개적으로 사용 가능한 헤더에서 나온 것인가? – phlipsy
예, 대략 인터페이스의 선언에 따라 빌드하는 것은 컴파일러입니다. DLL 지옥의 다소 불명예스러운 소스는 버전 관리가 어렵습니다. 인터페이스의 새로운 선언을 사용하고 실수로 DLL의 이전 버전을로드하는 클라이언트는 심하게 충돌합니다. COM에서 변경 한 인터페이스 IID를 항상 변경해야하는 핵심 이유가 있습니다. –