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

时间:2009-06-03 17:42:23

标签: c com gcc activex idispatch

我需要使用R工具中包含的gcc编译器(R为windows的统计程序)编译我的一些代码,问题是我需要在我的代码中使用IDispatch来创建访问COM的方法对象,gcc编译器不支持我用来做的很多代码,基本上是C ++代码。

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

3 个答案:

答案 0 :(得分:17)

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

这是the link to Part 1

在该文章中有很多关于在C中使用COM的非常好的信息以及作者随后的后续(我认为系列中有3或4个)。

修改
我错了,有8个部分!

Part 2
Part 3
Part 4
Part 5
Part 6
Part 7
Part 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库。