如何在plain C中使用IDispatch来调用COM对象

我需要使用R工具中包含的gcc编译器(R为Windows的统计程序)编译我的一些代码,问题是我需要在我的代码中使用IDispatch来创建访问COM对象的方法,以及gcc编译器不支持我用来执行的大部分代码,这基本上是C ++代码。

所以我的问题是如何在C中使用IDispatch来创建COM对象,而不必依赖于MFC,.NET,C#,WTL或ATL。 我相信如果我这样做,我将能够毫无问题地编译我的代码。

CodeProject上有一篇很棒的文章,名为“普通C中的COM”。

这是第1部分的链接 。

在该文章和作者的后续跟进中有很多关于在C中使用COM的非常好的信息(我认为系列中有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; 

请注意,每个方法都有一个THIS指针作为第一个参数,并且您需要定义更多类型,例如ITypeInfo,REFIID,DISPID等。

所以,这是一项艰巨的任务。 但是可以在纯C中创建C ++接口。

您也可以使用disphelper库。

Interesting Posts