IDL에서 iunknown 유래 인터페이스를 듀얼로 표시하는 의미가 있습니까?
-
06-07-2019 - |
문제
코드 검토 .idl 파일 중 하나에서 호기심 많은 정의를 찾았습니다.
[
object,
uuid(uuidhere),
dual,
nonextensible,
oleautomation,
hidden
]
interface IOurInterface : IUnknown {
//methods here
};
인터페이스가 어떻게 직접 파생 될 수 있습니까? IUnknown
아마도 듀얼 인터페이스 일 수 있습니까? 내가 제거하면 어떤 것이 끊어 질 것입니다 dual
기인하다?
해결책
~ 안에 이 답변 마샬링에 관한 또 다른 질문에 사용자 보이 세 ~를 가리키다 이 기사 기본적으로 다음을 나타냅니다.
인터페이스 (idispatch-derived 또는 not)가 표시 될 때 dual
또는 oleautomation
(또는 둘 다) 특별히 치료됩니다 RegisterTypeLib()
호출됩니다 (일반적으로 dllregisterserver에 의해 수행됨). 각각의 인터페이스에 대해 {00020424-0000-0000-0000-000000000046} 클래스가 프록시/스텁으로 참조되는 hkcr interface {interfaceid} 키가 만들어집니다. 이 클래스 ID는 Oleautomation Marshaller로도 알려진 Typelib Marshaller에 해당합니다.
다른 팁
여기서 문서를 감안할 때 그것이 효과가있는 이유를 볼 수 없습니다.http://msdn.microsoft.com/en-us/library/aa366807(vs.85).aspx
이중 속성으로 식별 된 인터페이스는 자동화와 호환되어야하며 IDISPATCH에서 파생되어야합니다. 이 속성은 dispinterfaces에서 허용되지 않습니다.
그럴 수 있습니다 [dual]
속성은 암시 적으로 추가됩니다 IDispatch
인터페이스에.
당신이 할 수있는 것은 인터페이스를 구현하는 코드를 점검하는 것입니다 (ATL이라고 가정). IDispatchImpl
. 그렇다면 실제로 Qi에 응답합니다 IDispatch
그리고 그렇게 사용될 수 있습니다.
또 다른 대안은 객체 구현을 인스턴스화하는 것입니다 IOurInterface
그리고 qi it IDispatch
- 성공하면 아마 제거 할 수 없을 것입니다.
사실, 생각해보십시오 [dual]
기술적으로 당신이 파생 할 것을 요구하지 않습니다 IDispatch
사용자 정의 인터페이스와 IDispatch
?