Как использовать IDispatch в обычном C для вызова COM-объекта

Мне нужно скомпилировать некоторый мой код, используя компилятор gcc, включенный в R tools (R статистическая программа для windows), проблема в том, что мне нужно использовать IDispatch в моем коде для создания доступа к методам COM-объекта, и компилятор gcc не поддерживает большую часть кода, который я использую для этого, который в основном является кодом C++.

Так мой вопрос как я могу использовать IDispatch в C, чтобы создать COM-объект с МФЦ, .Чистая, с#, ВТО, или ATL. Я считаю, что если я это сделаю, я смогу скомпилировать мой код без каких либо проблем.

3 ответов


есть отличная статья о CodeProject под названием "COM in plain C".

здесь ссылка на Часть 1.

в этой статье есть много очень хорошей информации о работе с COM в C и последующих последующих действиях автора (Я думаю, что в серии есть 3 или 4).

Edit:
Я ошибся, есть 8 частей!

Часть 2
Часть 3
часть 4
Часть 5
Часть 6
Часть 7
Часть 8


В общем, интерфейс C++ интерфейс IDispatch-это просто таблица указателей на функции. В C, это будет выглядеть примерно так:

typedef struct {
  HRESULT(*pQueryInterface)(void* this, REFIID riid, void **ppvObject);
  ULONG(*pAddRef)(void* this);
  ULONG(*pRelease)(void* this);
  HRESULT(*pGetTypeInfoCount)(void* this, unsigned int* pctInfo);
  HRESULT(*pGetTypeInfo)(void* this, unsigned int iTInfo,LCID lcid, ITypeInfo** ppTInfo);
  HRESULT(*pGetIDsOfNames)(void* this, REFIID riid, OLECHAR** rgszNames, unsigned int cNames, LCID lcid, DISPID* rgDispId);
 HRESULT(*pInvoke)(void* this, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, unsigned int* puArgErr);
} IDispatch_in_C;

обратите внимание, что каждый метод имеет указатель THIS в качестве первого параметра и что вам нужно будет определить больше типов, таких как ITypeInfo, REFIID, DISPID и т. д.

Итак, это большая задача. Но можно создать интерфейсы C++ в чистом C.


также вы можете использовать disphelper библиотека.