我需要使用R工具中包含的gcc编译器(R为windows的统计程序)编译我的一些代码,问题是我需要在我的代码中使用IDispatch来创建访问COM的方法对象,gcc编译器不支持我用来做的很多代码,基本上是C ++代码。
所以我的问题是如何在C中使用IDispatch来创建COM对象,而不必依赖于MFC,.NET,C#,WTL或ATL。我相信如果我这样做,我将能够毫无问题地编译我的代码。
答案 0 :(得分:17)
CodeProject上有一篇很棒的文章,名为“普通C中的COM”。
在该文章中有很多关于在C中使用COM的非常好的信息以及作者随后的后续(我认为系列中有3或4个)。
修改强>
我错了,有8个部分!
答案 1 :(得分:4)
通常,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 ++接口。
答案 2 :(得分:3)
您也可以使用disphelper库。