0

我想向IStream*我的 COM 接口添加一个接受方法。这是空闲摘录:

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 导入另一个项目。

当我查看.tlbOLEView 文件时,我看到IStream在我的 typelib 中声明了但IUnknown不是。这会导致问题 - 当我尝试调用IMyInterface::LoadStream()另一个项目时,C++ 说它无法转换IStream*MyLibrary::IStream*. 同时它也不会抱怨 IUnknown。

为什么 MIDL 将 IStream 定义放在 typelib 中而不将其视为全局定义?

4

1 回答 1

0

您有两个 IStream,一个是全局的(在 objidl.idl 中声明),另一个在 MyLibrary 命名空间中(在您的 idl 中声明)。删除 MyLibrary 命名空间中的那个。

如果您打算支持脚本客户端,我建议您还公开一个 IDispatch 接口,因为脚本语言不支持 IStream。

于 2009-11-12T21:33:00.397 回答