2009-12-08 4 views
1

일부 기존 C++ 코드로 작업 중이며 인터페이스를 확장해야합니다. 현재 인터페이스는 다음과 같습니다.COM 인터페이스 (IDL)를 올바르게 확장

[ 
    object, 
    uuid(guid), 
    version(1.0), 
    dual, 
    nonextensible, 
    oleautomation 
] 
interface IInfo : ITask { 
    // Methods here 
} 

[ 
    object, 
    uuid(guid), 
    version(1.0), 
    dual, 
    nonextensible, 
    oleautomation 
] 
interface IExtendedInfoTask : IInfo { 
    // Methods here 
} 

IInfo 인터페이스를 확장하고 싶습니다. 이제 내 이해에서 올바른 방법은 IInfo 인터페이스를 상속하는 IInfo2 인터페이스를 만드는 것이지만,이 Info2를 상속하려면 IExtendedInfoTask가 필요합니다. 현재의 상속을 변경하면 기존 인터페이스가 손상되지 않습니까?

이 작업을 수행하는 적절한 방법은 IInfo2를 확장하고 IExtendedInfoTask의 메서드를 복제하는 IExtendedInfoTask를 만드는 것입니까?

+0

C++이 아닌 IDL 질문이 아닙니까? –

+0

죄송합니다, 네 말이 맞습니다. – Kyle

답변

8

올바른 방법은 새 IInfo2 인터페이스를 확장하는 IExtendedInfoTask2를 만드는 것입니다. COM은 한 번 정의 된 인터페이스가 변경되지 않도록 요구합니다.

호출자가 두 버전을 모두 사용할 수 있도록 동일한 클래스에서 IExtendedInfoTask와 IExtendedInfoTask2를 구현하도록 할 수 있습니다. 그것은 vtable 차이 일뿐입니다. 별도로 메소드를 구현할 필요가 없습니다.

+0

완벽한, 감사합니다! – Kyle

+0

Tadmas, IExtendedInfoTask 끝에 새 함수를 추가 할 때의 문제점은 무엇입니까? –

+0

@lzprgmr http://msdn.microsoft.com/en-us/library/ms688484(v=vs.85).aspx - 버전 관리에 문제가 없도록 인터페이스를 변경할 수 없습니다. 계약을 변경할 때 IID를 변경하면 버전 관리를 명시 적으로 수행 할 수 있습니다. 이전 방법 인 "DLL 지옥"대신에 SxS 어셈블리를 사용하는 것과 같은 기본 원칙이 있습니다. 마지막으로 tasking 메소드의 특정 문제는 인터페이스 구현이 이전 버전으로 대체되면 여전히 동일한 IID를 요청하고 있으며 메소드가 존재하지 않으므로 런타임에 (또는 그보다 더) 불어납니다. . – Tadmas

관련 문제