Come utilizzare IDispatch in pianura C per chiamare un oggetto COM
Domanda
Ho bisogno di compilare un codice di mine con il compilatore gcc incluso negli strumenti di R (R il programma statistico per le finestre), il problema è che ho bisogno di usare IDispatch nel mio codice per creare un accesso ai metodi di una COM oggetto, e il compilatore gcc non supporta gran parte del codice che sto usando per farlo, che è fondamentalmente codice C ++.
Quindi la mia domanda è come posso utilizzare IDispatch in C per creare l'oggetto COM, senza dover dipendere da MFC, .NET, C #, WTL o ATL. Credo che se lo faccio io sarò in grado di compilare il mio codice senza alcun problema.
Soluzione
C'è un grande articolo su CodeProject intitolato "COM in C puro".
Ecco il link alla Parte 1 .
Ci sono un sacco di ottime informazioni su come lavorare con COM in C in tale articolo e dell'autore successivi follow-up (penso che ci sono 3 o 4 della serie).
Modifica
Ho sbagliato, ci sono 8 parti!
Altri suggerimenti
In generale, un'interfaccia C ++ IDispatch è solo una tabella di puntatori a funzione. In C, sarebbe simile a:
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;
Si noti che ogni metodo ha un questo puntatore come primo parametro, e che sarà necessario definire più tipi, come ad esempio ITypeInfo, REFIID, DISPID, ecc, ecc.
Quindi, è un grande compito. Ma è possibile creare interfacce C ++ in puro C.
Inoltre è possibile utilizzare disphelper biblioteca.