Как использовать IDispatch в простом C для вызова COM-объекта - PullRequest
14 голосов
/ 03 июня 2009

Мне нужно скомпилировать некоторый мой код с помощью компилятора gcc, включенного в инструменты R (R статистическая программа для Windows), проблема в том, что мне нужно использовать IDispatch в моем коде для создания доступа к методам COM объект, и компилятор gcc не поддерживает большую часть кода, который я использую для этого, который в основном является кодом C ++.

Поэтому мой вопрос заключается в том, как я могу использовать IDispatch в C для создания COM-объекта без необходимости зависеть от MFC, .NET, C #, WTL или ATL. Я верю, что если я это сделаю, я смогу без проблем скомпилировать свой код.

Ответы [ 3 ]

17 голосов
/ 03 июня 2009

На CodeProject есть отличная статья под названием «COM на обычном C».

Вот ссылка на Часть 1 .

В этой статье содержится много очень полезной информации о работе с COM на C и последующих последующих действиях автора (я думаю, что в серии 3 или 4).

Edit:
Я ошибся, там 8 частей!

Часть 2
часть 3
часть 4
часть 5
часть 6
часть 7
Часть 8

4 голосов
/ 03 июня 2009

В общем, интерфейс C ++ IDispatch - это просто таблица указателей на функции. В Си это будет выглядеть примерно так:

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.

3 голосов
/ 04 июня 2009

Также вы можете использовать библиотеку disphelper .

...