2009-11-12 16 views
0

我想添加一個接受IStream*到我的COM接口的方法。這裏的IDL摘錄:導入typelib時奇怪的命名空間

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定義放入typelib中,而不是將其視爲全局定義?

+0

FYI,ocidl.idl導入oaidl.idl,oaidl.dil導入objidl.idl,objidl.idl導入unknwn.idl。所以你只需要導入ocidl.idl。 – 2015-02-06 21:08:36

回答

0

你有兩個IStreams,一個是全局的(在objidl.idl中聲明),另一個是MyLibrary命名空間中的(在你的idl中聲明的)。刪除MyLibrary命名空間中的一個。

如果您打算支持腳本客戶端,我建議您還公開一個IDispatch接口,因爲腳本語言不支持IStream。

+0

這就是我沒有得到的。我該如何刪除in-typelib聲明? – sharptooth 2009-11-13 06:23:16

+0

從idl中刪除IStream聲明。 – 2009-11-13 14:39:44

+0

如果我刪除導入「objidl.idl」,行爲保持不變。我還可以做些什麼? – sharptooth 2009-11-16 06:57:33