Когда вы вызываете CoCreateInstance, она находит CLSID в реестре, считывает данные о расположении сервера, загружает сервер в память и создает экземпляр CO-класса, который вы запрашивали.
Вот пример, в котором создается объект CLSID_ShellLink и запрашивается указатель на интерфейс IShellLink, которым владеет этот COM-объект.
HRESULT hr;
IShellLink* pISL;
hr = CoCreateInstance (CLSID_ShellLink, // CLSID CO-класса
NULL, // агрегация не используется
CLSCTX_INPROC_SERVER, // тип сервера
IID_IShellLink, // IID интерфейса
(void**)&pISL); // Указатель на наш интерфейсный указатель
if (SUCCEEDED(hr)) {
// Здесь можно вызывать методы, используя pISL.
} else {
// Невозможно создать объект COM. hr присвоен код ошибки.
}
В начале мы объявляем переменную типа HRESULT для хранения значения, возвращаемого CoCreateInstance и указатель на IShellLink. Затем мы вызываем CoCreateInstance для создания нового COM-объекта. Макрос SUCCEEDED возвращает TRUE, если hr хранит код успешного завершения, или FALSE, если hr содержит код ошибки. Есть также похожий макрос – FAILED, который проверяет значение на предмет соответствия коду ошибки (т.е. делает все наоборот).
Как уже было сказано ранее, вам не надо освобождать COM-объекты – достаточно сообщить им, что они больше не нужны. Интерфейс IUnknown, являющийся прародителем всех COM-объектов, содержит метод Release. Вы должны вызвать этот метод для того, чтобы сообщить COM-объекту, что вы в нем более не нуждаетесь. Однажды вызвав Release, вы больше нигде не сможете использовать указатель на интерфейс, т.к. COM-объект может исчезнуть из памяти в любое время.
Продолжим предыдущий пример, добавив команду удаления объекта:
// Создаем COM-объект как раньше и…
if (SUCCEEDED(hr)) {
// Вызов методов интерфейса через pISL.
// Сообщим COM-объекту о том, что он нам больше не нужен.
pISL->Release;
}
Интерфейс IUnknown будет детально рассмотрен в следующем разделе.
[
Q 1. Есть окно нестандартной формы (например, круглое). Но рамка, появляющаяся вокруг него при перемещении, – строго прямоугольной формы. Как избавиться от такой рамки вообще? Или, может быть, ее можно сделать тоже произвольной формы (по контуру окна)?
2. Как избавиться от пунктирной рамки на кнопке, имеющей фокус? Для кнопки, сделанной из красивого рисунка, такая рамка выглядит лишней…