我需要使用 R 工具中包含的 gcc 编译器(R 是 windows 的统计程序)编译我的一些代码,问题是我需要在我的代码中使用 IDispatch 来创建访问 COM 对象的方法,并且gcc 编译器不支持我用来执行此操作的大部分代码,这些代码基本上是 C++ 代码。
所以我的问题是如何在 C 中使用 IDispatch 来创建 COM 对象,而不必依赖于 MFC、.NET、C#、WTL 或 ATL。我相信如果我这样做,我将能够毫无问题地编译我的代码。
通常,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库。