Программирование звука в DirectSound - Интерфейс IUnknown
ОГЛАВЛЕНИЕ
Интерфейс IUnknown
Является базовым для всех интерфейсов COM и содержит средства фиксации объекта, его освобождения и запроса нужного интерфейса из набора (агрегата).
QueryInterface - запрос интерфейса из набора
HRESULT IUnknown::QueryInterface (
REFIID IID,
LPVOID *Obj
);
- IID - идентификатор (GUID) требуемого интерфейса;
- Obj - указатель переменной, в которую будет занесен указатель объекта, имеющего требуемый интерфейс.
Если объект, для которого интерфейс IUnknown является базовым, имеет указанный интерфейс, то в заданную переменную заносится указатель объекта, через который доступен запрашиваемый интерфейс.
Обычно в качестве переменной выступает указатель объекта того типа, который имеет запрашиваемый интерфейс в своем составе. Например, при получении интерфейса IDirectSound3DBuffer из объекта с указателем Buf типа IDirectSoundBuffer вызывается метод
Buf->QueryInterface (IID_IDirectSound3DBuffer, (LPVOID *)&Buf3D),
где Buf3D - указатель объекта типа IDirectSound3DBuffer. Указатели Buf и Buf3D обычно ссылаются на один и тот же объект, однако рассчитывать на это не стоит.
При успешном завершении функция возвращает код S_OK (нуль). Возможными кодами ошибки могут быть E_NOINTERFACE (исходный объект не имеет требуемого интерфейса) и E_POINTER (передан недопустимый указатель переменной).
Счетчик ссылок полученного объекта увеличивается на единицу. При завершении работы с полученным интерфейсом необходимо освободить объект методом Release.
AddRef - фиксация объекта
ULONG IUnknown::AddRef ();
Увеличивает счетчик ссылок объекта на единицу. При создании объекта счетчик устанавливается в единицу, при получении нового интерфейса счетчик автоматически увеличивается на единицу.
При завершении работы с объектом должен быть вызван метод Release, уменьшающий счетчик ссылок на единицу. Когда количество ссылок становится нулевым, объект уничтожается.
Функция возвращает значение обновленного счетчика ссылок.
Release - освобождение объекта
ULONG IUnknown::Release ();
Уменьшает счетчик ссылок объекта на единицу. При обнулении счетчика объект уничтожается. Метод должен вызываться для всех объектов, полученных приложением, при завершении работы с ними.