Cómo utilizar IDispatch en C plano para llamar a un objeto COM
Pregunta
necesito para compilar un código de la mina usando el compilador gcc incluye en las herramientas de I (R programa estadístico para las ventanas), el problema es que necesito utilizar IDispatch en mi código para crear un acceso a los métodos de un COM objeto, y el compilador gcc no soporta gran parte del código que estoy usando para ello, que es básicamente el código C ++.
Así que mi pregunta es ¿cómo puedo usar IDispatch en C para crear el objeto COM sin tener que depender de MFC, .NET, C #, WTL, o ATL. Creo que si lo hago voy a ser capaz de compilar mi código sin ningún problema.
Solución
Hay un gran artículo sobre CodeProject titulado "COM en C plano".
Aquí es el enlace a la Parte 1 .
Hay un montón de muy buena información sobre cómo trabajar con COM en C en ese artículo y del autor seguimientos posteriores (creo que hay 3 o 4 de la serie).
Editar
Estaba equivocado, hay 8 partes!
Otros consejos
En general, una interfaz de C ++ IDispatch es sólo una tabla de punteros de función. En C, se vería algo como:
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;
Tenga en cuenta que cada método tiene un este puntero como primer parámetro, y que tendrá que definir más tipos, tales como ITypeInfo, REFIID, DISPID, etc, etc.
Por lo tanto, es una gran tarea. Sin embargo, es posible crear interfaces de C ++ en C puro.
También se puede usar disphelper biblioteca.