我想在我的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
文件并在另一个项目中导入typelib。
当我查看OLEView文件中的.tlb
时,我看到IStream
在我的类型库中声明,但IUnknown
不是。这会导致问题 - 当我尝试在另一个项目中调用IMyInterface::LoadStream()
时,C ++表示无法将IStream*
转换为MyLibrary::IStream*
。同时它不会抱怨IUnknown。
为什么MIDL将IStream定义放在typelib中而不将其视为全局定义?
答案 0 :(得分:0)
您有两个IStream,一个是全局的(在objidl.idl中声明),另一个在MyLibrary命名空间中(在您的idl中声明)。删除MyLibrary命名空间中的那个。
如果您计划支持脚本客户端,我建议您也公开IDispatch接口,因为脚本语言不支持IStream。