Pergunta

Eu preciso compilar algum código da mina usando o compilador gcc incluído nas ferramentas R (R o programa estatístico para janelas), o problema é que eu preciso para usar IDispatch no meu código para criar um acesso os métodos de uma COM objeto, eo compilador gcc não suporta grande parte do código que estou usando para fazer isso, que é basicamente C ++ código.

Assim, a minha pergunta é como eu posso usar IDispatch em C para criar o objeto COM sem ter que depender de MFC, .NET, C #, WTL ou ATL. Eu acredito que se eu fizer isso vou ser capaz de compilar meu código sem qualquer problema.

Foi útil?

Solução

Há um ótimo artigo sobre CodeProject intitulado "COM em C simples".

Aqui está o link para a Parte 1 .

Há um monte de muito boas informações sobre como trabalhar com COM em C nesse artigo e subsequentes follow-ups do autor (Eu acho que há 3 ou 4 na série).

Editar:
Eu estava errado, há 8 partes!

Parte 2
Parte 3
Parte 4
Parte 5
Parte 6
Parte 7
Parte 8

Outras dicas

Em geral, uma interface C ++ IDispatch é apenas uma tabela de ponteiros de função. Em C, seria 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;

Note que cada método tem um este ponteiro como o primeiro parâmetro, e que você terá de definir mais tipos, tais como ITypeInfo, REFIID, DISPID, etc, etc.

Então, é uma grande tarefa. Mas é possível criar interfaces C ++ em C puro.

Além disso, você pode usar disphelper biblioteca .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top