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

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

Поэтому мой вопрос заключается в том, как я могу использовать IDispatch в C для создания COM-объекта, не завися от MFC, .NET, C #, WTL или ATL. Я считаю, что если я это сделаю, я смогу скомпилировать свой код без каких-либо проблем.

В CodeProject есть статья «COM в простой C».

Вот ссылка на Часть 1 .

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

Редактировать:
Я был неправ, есть 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; 

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

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

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