Как использовать IDispatch на простом языке C для вызова COM-объекта

StackOverflow https://stackoverflow.com/questions/946114

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Редактировать:
Я ошибся, там 8 частей!

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

Другие советы

В общем, интерфейс 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.

Также вы можете использовать дисхелпер библиотека.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top