Как использовать IDispatch в простой C для вызова COM-объекта
Мне нужно скомпилировать некоторый код с помощью компилятора gcc, включенного в инструменты R (R - статистическая программа для Windows), проблема в том, что мне нужно использовать IDispatch в моем коде для создания доступа к методам COM объект, а gcc-компилятор не поддерживает большую часть кода, который я использую для этого, что в основном является кодом на С++.
Итак, мой вопрос заключается в том, как я могу использовать IDispatch в C для создания COM-объекта, не завися от MFC,.NET, С#, WTL или ATL. Я считаю, что если я это сделаю, я смогу скомпилировать свой код без каких-либо проблем.
Ответы
Ответ 1
В CodeProject есть статья "COM в простой C".
Вот ссылка на Часть 1.
Существует много очень хорошей информации о работе с COM в C в этой статье и последующих последующих комментариях автора (я думаю, что в серии есть 3 или 4).
Edit:
Я был неправ, есть 8 частей!
Часть 2
Часть 3
Часть 4
Часть 5
Часть 6
Часть 7
часть 8
Ответ 2
В общем, интерфейс С++ 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.
Ответ 3
Также вы можете использовать disphelper библиотеку.