Передача интерфейса 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,

0 ответов

Другие вопросы по тегам