[英]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。 我相信如果我這樣做,我將能夠毫無問題地編譯我的代碼。
通常,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.