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