Как определить реализацию COM-класса? - PullRequest
5 голосов
/ 28 июня 2011

Я новичок в COM, и я посмотрел в Интернете, чтобы найти, как создать класс COM в C ++ (для использования в C #).Я видел это в файле .idl, я должен поставить что-то вроде этого:

[
object,
uuid(a93164ee-e6d4-44be-aa27-f00ce6972719),
helpstring("interface ITopologyQuery")
]

interface ITopologyQuery : IUnknown
{
  HRESULT LoadFile(BSTR completeFileName);

  HRESULT SetParameters(int above, int percentage);
}

[
  uuid(a958f2af-8b55-43c4-9fc3-c39d83fc1376)
]
library TopologyQueryLib
{
  [
    uuid(cc814992-31ec-4a1f-a41e-111ade27bdfe),
    helpstring("TopologyQuery class")
  ]
  coclass CTopologyQuery
  {
    [default] interface ITopologyQuery;
  };
}

Теперь мой вопрос: где вы определяете класс CTopologyQuery?Если я определю его как обычный класс c ++ в другом файле, будет ли компилятор правильно связывать мой класс с интерфейсом?Код класса c ++ выглядит следующим образом (он реализован в файле .cpp):

class CTopologyQuery : public ITopologyQuery
{
  public:

    __stdcall CTopologyQuery();

    //IUnknown interface 
    HRESULT __stdcall QueryInterface(REFIID riid, void **ppObj);
    ULONG   __stdcall AddRef();
    ULONG   __stdcall Release();

    //ITopologyQuery interface
    HRESULT __stdcall LoadTopologyFile(BSTR completeFileName);
    HRESULT __stdcall SetParameters(int above, int percentage);

  private:
};

На данный момент он компилируется, если я помещаю секцию библиотеки в файл .idl или нет.Я немного растерялся, что тут хорошего делать?Я понимаю, что определение coclass должно давать реализацию интерфейса по умолчанию, но для меня это выглядит как пустой класс без методов ...

1 Ответ

5 голосов
/ 28 июня 2011

Часть IDL (Язык определения интерфейса) определяет двоичный интерфейс независимым от языка способом, который очень похож на C ++.

Обычно используется для создания двоичной библиотеки типов , который является DLL с информацией о вашем классе COM.Вы можете использовать Microsoft COM / OLE Viewer для просмотра существующих библиотек типов.

Для использования C ++ вашего не IDispatch COM-класса вам не нужна эта информация о вашем классе, поскольку все, что нужно компилятору C ++знать (как минимум) в вашем заголовочном файле C ++.

Но сгенерированная из этого библиотека IDL и библиотека типов помогают генерировать связующий код для использования вашего COM-класса из C # иДругие языки.Насколько я помню, это также может помочь сгенерировать ключи реестра Windows и значения, необходимые для использования вашего класса COM через CoCreateInstance и друзей.Так что это немного инфраструктурный механизм, так сказать, по существу поддерживающий независимое от языка представление и использование вашего COM-класса.

Cheers & hth.,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...