导入类型库时添加奇怪的命名空间

时间:2009-11-12 14:23:17

标签: windows visual-studio com com-interop midl

我想在我的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中而不将其视为全局定义?

1 个答案:

答案 0 :(得分:0)

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

如果您计划支持脚本客户端,我建议您也公开IDispatch接口,因为脚本语言不支持IStream。