我在C#中实现了以下COM对象
[ComVisible(true), Guid("AAAABBBB-CCCC-DDDD-EEEE-FFFFAAAABBBB")]
class Foo : IFoo, IBar
{
// Implementation
}
我将以下COM接口放入另一个用C ++实现的COM对象中。
[Guid("FFFFEEEE-DDDD-CCCC-BBBB-AAAAFFFFEEEE")]
[TypeLibType(4160)]
public interface IAcceptFoo2 : IAcceptFoo
{
[DispId(1)]
void AcceptFoo(ref IFoo foo, IOther other, bool Check);
// Additional methods
}
我从C#调用这个接口:
Foo fooConcrete = new Foo();
IFoo fooInterface = fooConcrete as IFoo;
acceptFooConcrete.AcceptFoo(ref fooInterface, other, check);
我可以调试本机代码,我看到foo
参数是一个有效指针(但nullptr
有一个_vfptr
),但该对象执行以下{{1} }}
QueryInterface
此IBarPtr spBar;
HRESULT hr = foo->QueryInterface(IID_IBar, reinterpret_cast<void**>(&spBar));
调用QueryInterface
接口也在IBar
上实施,生成Foo
。
抛出异常:读取访问冲突。
我很好奇我是否错过了某种类型的Marshaling,因为Access Exception
参数传递为IFoo
。