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

Vic*_*Vic 14 c com gcc activex idispatch

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

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

Rob*_*Rob 17

CodeProject上有一篇很棒的文章题为"普通C中的COM".

这是第1部分的链接.

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

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

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


abe*_*nky 5

一般来说,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;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请注意,您需要确保您的调用约定匹配,否则您的参数传递顺序和堆栈清理将无法正常工作。确保这些方法声明为使用“stdcall”调用约定。 (4认同)