Передача интерфейса COM по ссылке через COM Interop
У меня есть следующий COM-объект, реализованный в C#
[ComVisible(true), Guid("AAAABBBB-CCCC-DDDD-EEEE-FFFFAAAABBBB")]
class Foo : IFoo, IBar
{
// Implementation
}
У меня есть следующий интерфейс COM в другой объект COM, реализованный в C++.
[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
), однако объект выполняет следующее QueryInterface
IBarPtr spBar;
HRESULT hr = foo->QueryInterface(IID_IBar, reinterpret_cast<void**>(&spBar));
это QueryInterface
позвонить, чтобы получить IBar
Интерфейс также реализован на Foo
генерирует Access Exception
,
Исключение: нарушение прав на чтение.
Мне любопытно, если я пропускаю какой-то маршалинг, потому что IFoo
параметр передается как ref
,