Получение COM-объектов из неуправляемого кода - PullRequest
3 голосов
/ 29 января 2010

У меня есть библиотека, которая экспортирует неуправляемую подпрограмму C, которая возвращает указатели на объекты на основе COM IUnknown. DLL не зарегистрирована и не является сервером. Я хотел бы использовать типы COM из C #.

Я уже написал C # интерфейсы для типов COM. Что такое эквивалент C # вызова LoadLibrary () и GetProcAddress ()? Как бы я вызвал результат GetProcAddress () и затем вызвал бы его, чтобы загрузить указатель интерфейса COM?

Вот фрагмент кода C ++, который иллюстрирует, что я преследую:

// Assume I have previously declared IMyType
HANDLE mylib = ::LoadLibrary("myfakecom.dll");
IUnknown* (*GetterFunc) getter;
getter = (GetterFunc)::GetProcAddress(mylib, "GetFactory");
IUnknown *unk = getter();
IMyType *mytype = unk->QueryInterface(IID_MYTYPE);

Моя интуиция говорит: «Делай это с C ++ / CLI», хотя я не уверен, как бы я это сделал для любого универсального типа, и как я бы привел необработанные указатели IUnknown в типы указателей менеджера, которые я объявил бы, используя [ Guid] атрибуты в управляемом интерфейсе.

1 Ответ

1 голос
/ 29 января 2010

Вам просто нужно использовать взаимодействие для описания вашей функции GetFactory, что-то вроде этого

[DllImport("myfakecom.dll")]
[return: MarshalAs(UnmanagedType.IUnknown)]
static extern object GetFactory();

Тогда, когда у вас есть объект в управляемом коде. Приведение является эквивалентом QueryInterface

void Foo(Object unk)
{
    IMyType mytype = (IMyType)unk;
} 

Вам нужно будет продублировать определения интерфейса C ++ как определения интерфейса C #, возможно, с атрибутами [marshalas]. Но так как вы уже сделали это, остальное должно быть легко.

Я бы посоветовал вам сменить заводской прототип с

IUnknown * GetFactory();

до

HRESULT GetFactory([out] IUnknown ** ppunk);

Судя по всему, в iterop-коде COM существует сильное предположение о том, что все COM-методы возвращают HRESULT, и будет проще заставить работать маршаллинг, если вы пойдете туда с потоком.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...