16

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

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

4

3 回答 3

19

CodeProject 上有一篇很棒的文章,题为“COM in plain C”。

这是第 1 部分的链接

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

编辑:
我错了,有8个部分!

第 2
部分 第 3
部分 第 4
部分 第 5
部分 第 6
部分 第 7
部分 第 8 部分

于 2009-06-03T18:11:42.513 回答
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++ 接口。

于 2009-06-03T18:11:01.857 回答
4

您也可以使用disphelper库。

于 2009-06-04T11:57:52.410 回答