簡體   English   中英

如何在普通C中使用IDispatch來調用COM對象

[英]How to use IDispatch in plain C to call a COM object

我需要使用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庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM