如何通过COM互操作访问公开多个接口的类?

如何通过COM互操作访问公开多个接口的类?,com,com-interop,typelib,midl,tlbimp,Com,Com Interop,Typelib,Midl,Tlbimp,我有一个CoClass,描述如下: [ uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx), version(1.0), helpstring("FooBar") ] coclass FooBar { [default] interface IFoo; interface IBar; } 因此,我的问题是: 为什么tlbimp只显示IFoo接口,而oleview.exe显示两个接口 tlbimp是否只公开接口?为什么

我有一个CoClass,描述如下:

[
    uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx), 
    version(1.0), 
    helpstring("FooBar")
]
coclass FooBar
{
    [default] interface IFoo;
    interface IBar;
}
因此,我的问题是:

  • 为什么
    tlbimp
    只显示
    IFoo
    接口,而
    oleview.exe
    显示两个接口
  • tlbimp
    是否只公开接口?为什么?(根据MSDN
    [默认值]
    “供宏语言使用。”)
  • 如何在MIDL/COM中对此案例进行建模?我应该使用关联而不是继承吗

  • 如果在同一个idl文件中声明接口或从另一个idl文件导入接口,则对象可以根据需要公开任意多个接口。使用CoCreateInstance()获取对象后,需要使用QueryInterface()获取所需的接口。也看看和考虑参考。还有一些例子。谢谢你的评论。我知道我可以通过
    QueryInterface()
    访问接口,但我的问题涉及从
    tlbimp
    生成并由.NET客户端访问的RCW。我无法在.NET 2.0中调用
    QueryInterface
    (我猜它是在.NET 4.0中引入的,但这不是一个选项)。CLR自动调用QueryInterface,只需将对象强制转换为接口类型。@Hanpassant:谢谢!:)但是当我调用
    IBar.Something()
    比如
    new FooBar().Something()
    (没有显式地将其强制转换为IBar)时,InterOp不能自动
    QueryInterface
    ?我不明白的是为什么interop没有从所有接口继承CoClass。。。这将简化客户端开发,因为我可以使用IntelliSense查看所有接口的所有成员。我将接受证实该决定的答复。:)