Применение библиотеки DirectX
Так, СОМ-система включается и выключается при помощи вызовов функций Со I n i t i а 1 i ze (NULL) и CoLIn i n i t i a 1 i ze (). Для поиска и загрузки СОМ-сервера, создания СОМ-объекта и получения одного из его интерфейсов Windows предоставляет функцию CoCreateInstance().
СОМ-сервер не экспортирует имен СОМ-объектов, но он экспортирует несколько функций со стандартными именами:
_declspec(dl1 export) int DllGetClassObject(
REFCLSID rclsid. REFIID riid.void** ppv); _declspec(dllexport) STDAPI DllCanUnloadNow(void):
В этом объявлении REFCLSID и REFIID являются типами данных, которые создают ссылки на глобально уникальные идентификаторы.
Все интерфейсы СОМ-объектов обязательно являются наследниками стандартного интерфейса IUnknown. Метод QueryInterfaceCREFIID ri id, void **ppvObject) позволяет, имея указатель на один из интерфейсов, получить указатель * ppvObject любого другого интерфейса объекта. Необходимо только указать ссылку на GUID требуемого интерфейса *ri id. Методы AddRef (void) и Releasee void) регулируют время жизни объекта. При запросе интерфейса вызывается функция AddRef (), а при его освобождении - Releasee). После освобождения всех запрошенных интерфейсов объект уничтожается, а после уничтожения всех объектов может быть удалена из системной памяти и DLL-библиотека, реализующая функциональность СОМ-сервера.
ВНИМАНИЕФункция CoCreateInstance(), получающая первый из интерфейсов объекта, и Querylnterface() вызывают метод AddRef() автоматически, а вот следить за освобождением интерфейсов должен сам программист. При создании объектов контекста устройства, таких, как перо или кисть, отмечалось, что в ОС решена проблема утечки памяти. Все не уничтоженные объекты при завершении приложения уничтожатся автоматически. СОМ-объект, у которого перед завершением приложения не освобожден интерфейс, останется в памяти до перезагрузки системы. Причина подобного поведения заключается в том, что ОС обращается за разрешением на выгрузку СОМ-сервера к его функции DIICanUnloadNow(), и пока все объекты не уничтожены, она такого разрешения не получит.