Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Роджерсон Д. - Основы COM - 2000.pdf
Скачиваний:
412
Добавлен:
13.08.2013
Размер:
2.4 Mб
Скачать

89

Функция

Назначение

 

 

StringFromIID

Безопасное с точки зрения приведения типов преобразование IID в

 

строку

StringFromGUID2

Преобразование GUID в текстовую строку; строка возвращается в

 

буфер, выделенный вызывающей программой

CLSIDFromString

Безопасное с точки зрения приведения типов преобразование строки

 

в CLSID

IIDFromString

Безопасное с точки зрения приведения типов преобразование строки

 

в IID

 

 

Некоторые их этих функций требуют использовать менеджер памяти задачи из предыдущего раздела:

wchar_t* string;

// Получить строку из CLSID

::StringFromCLSID(CLSID_Component1, &string);

// Использовать строку

...

// Освободить строку

::CoTaskMemFree(string);

Резюме

Строим ли мы дома (например, в гостиной) самолет, пишем ли ночами книгу или разрабатываем компоненты, большая часть нашего времени и энергии уходит на тысячи деталей. Внимание к деталям и правильное обращение с ними определяет успех. В этой главе Вы узнали, что СОМ использует HRESULT для возвращения кодов успеха или ошибки. Вы узнали о GUID — удивительной структуре данных, которая основана на алгоритме, позволяющем кому угодно, где угодно и когда угодно получать уникальный идентификатор. Вы также видели, что СОМ использует GUID для идентификации практически всех объектов, в том числе компонентов (CLSID) и интерфейсов (IID).

Вы узнали и о том, как CLSID транслируется в имя файла компонента с помощью Реестра Windows. Для регистрации компонента программа установки или REGSVR32.EXE вызывает функцию DllRegisterServer, экспортированную DLL компонента. В минимальном варианте компонент помещает в Реестр свой CLSID и имя файла.

В следующей главе мы увидим, как СОМ создает компонент при помощи CLSID. Это гораздо проще, чем построить самолет в гостиной.

Замечание о макросах определения интерфейсов

Существуют макросы, облегчающие программистам переход с C на C++; они помогают добиться того, чтобы одно и то же определение интерфейса работало в программах на обоих языках. Эти макросы есть как в OBJBASE.H, так и в BASETYPS.H. Ранее в примерах я использовал следующий простой интерфейс:

interface IX : IUnknown

{

virtual void __stdcall Fx() = 0;

};

При использовании упомянутых макросов этот интерфейс выглядит так:

DECLARE_INTERFACE(IX, IUnknown)

{

// IUnknown

STDMETHOD(QueryInterface) (THIS_ REFID, PPVOID) PURE; STDMETHOD_(ULONG, AddRef) (THIS) PURE; STDMETHOD_(ULONG, Release) (THIS) PURE;

// IX

STDMETHOD_(void, Fx) (THIS) PURE;

}

Однако сам я не использую эти макросы, предпочитая писать код так, чтобы он выглядел и работал, как код на С++. Если бы я собирался публиковать свои компоненты, чтобы их использовали другие люди, то писал бы интерфейс на специальном языке. Этот язык описания интерфейсов, называемый IDL, рассматривается в гл. 10 и 11.

Соседние файлы в предмете Программирование на C++