2009-11-12 3 views
0

내 COM 인터페이스에 IStream*을 수락하는 메서드를 추가하고 싶습니다. 다음은 IDL 발췌는 다음과 같습니다형식 라이브러리를 가져올 때 이상한 네임 스페이스 추가

import "oaidl.idl"; 
import "ocidl.idl"; 
import "objidl.idl";//IStream is declared in this .idl file 
[ 
    uuid(uuidhere), 
    version(1.0) 
] 
library MyLibrary 
{ 
    importlib("stdole32.tlb"); 
    importlib("stdole2.tlb"); 
    [ 
    object, 
    uuid("interfaceid"), 
    dual, 
    nonextensible, 
    oleautomation, 
    hidden 
    ] 
    interface IMyInterface : IUnknown { 
     HRESULT LoadStream([in] IStream* stream); 
     HRESULT LoadUnknown([in] IUnknown* unkn); 
    }; 
} 

나는 .idl 파일을 컴파일하고 다른 프로젝트에서 형식 라이브러리를 가져옵니다.

OLEView 파일에서 .tlb을 검토 할 때 IStream이 내 typelib에 선언되어 있지만 IUnknown은 그렇지 않습니다. 이로 인해 문제가 발생합니다. 다른 프로젝트에서 IMyInterface::LoadStream()을 호출하려고 시도하면 C++에서 IStream*MyLibrary::IStream*으로 변환 할 수 없다고 말합니다. 동시에 IUnknown에 대해 불평하지 않습니다.

왜 MIDL은 형식 정의 안에 IStream 정의를 넣고 전역 정의로 취급하지 않습니까?

+0

FYI, ocidl.idl import oaidl.idl, oaidl.dil은 objidl.idl을 가져오고 objidl.idl은 unknwn.idl을 가져옵니다. 따라서 ocidl.idl을 가져와야합니다. –

답변

0

하나는 전역 (objidl.idl로 선언 됨)이고 다른 하나는 MyLibrary 네임 스페이스 (IDL에 선언 됨)에있는 두 개의 IStream이 있습니다. MyLibrary 네임 스페이스에서 하나를 제거하십시오.

스크립트 클라이언트를 지원하려는 경우 IStream은 스크립트 언어에서 지원되지 않으므로 IDispatch 인터페이스도 노출하는 것이 좋습니다.

+0

그건 내가 얻지 못하는거야. in-typelib 선언을 제거하기 위해 정확히 무엇을해야합니까? – sharptooth

+0

IStream 선언을 idl에서 제거하십시오. –

+0

"objidl.idl"가져 오기를 제거하면 동작이 동일하게 유지됩니다. 그 밖의 무엇을 할 수 있습니까? – sharptooth

관련 문제