Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.07.2011, 19:50
Andrew McDrew Andrew McDrew вне форума
Прохожий
 
Регистрация: 11.07.2011
Сообщения: 2
Репутация: 10
По умолчанию Странности с AudioEndpoints

Здравствуйте.
Вопрос о изменении громкости в Винде начиная с Висты, там такие красивые интерфейсы, называется вроде CoreAPI. Есть маленькая программа, суть при запуске считывает информацию из реестра и соответственно выставляет громкость и мьют аудио устройств. Беспокоит процедура для висты, код пациента:
Код:
Procedure VistaAudio;
var i:Integer;
    DeviceEnumerator:IMMDeviceEnumerator;
    Device:IMMDevice;
    DeviceCollection:IMMDeviceCollection;
    EndpointVolume:IAudioEndpointVolume;
    Vol:Single;
begin
CoInitializeEx(nil,COINIT_APARTMENTTHREADED);
CoCreateInstance(CLASS_IMMDeviceEnumerator,nil,CLSCTX_INPROC_SERVER,
IID_IMMDeviceEnumerator,DeviceEnumerator);
DeviceEnumerator.EnumAudioEndpoints(eAll,DEVICE_STATEMASK_ALL,DeviceCollection);
//DeviceEnumerator._Release;

For i:=0 to NumDevs-1 do
 begin
 DeviceCollection.Item(i,Device);
 Device.Activate(IID_IAudioEndpointVolume,CLSCTX_INPROC_SERVER,nil,IUnknown(EndpointVolume));
 //Device._Release;
 Vol:=Volume[i]/100;
 EndpointVolume.SetMasterVolumeLevelScalar(Vol,nil);
 EndpointVolume.SetMute(Mute[i],nil);
 //EndpointVolume._Release;
 end;

// DeviceCollection._Release;
CoUninitialize;
end;
Шо характерно, так оно работает. Но по хорошему надо вроде сделать Релиаз всем интерфейсам, о чом говорит мсдн, еще и в примерах кода, вроде этого http://http://blogs.msdn.com/b/larry...ows-vista.aspx
Так вот, если раскомментить хоть один релиз, то при отладке все вроде нормально отрабатывает, а если запустить ехе отдельно то вылетает АкцессВиолейшн и адреса бывают как полный 00000000 или около него так и FFFFFFFF. Покопал шоумесседжами, вылетает оно на втором прохождении цыкла на команде Devise.Activate. Вроде гдето писали что 0 значит что обращаюсь к несуществующему обьекту, а большое число -- к уже уничтоженному. Но чего спрашивается вылетать если раскомментить только последний интерфейс DeviceCollection._Release(правда здесь не на Активейт) ??
Да и что характерно DeviceCollection._Release и EndpointVolume._Release возвращают 0, походу все на объект ссылок больше нет и оно самоуничтожается, зато остальные возвращают 1, что бы это значило? Кто-нибудь с таким сталкивался, знает как аккуратно все объекты уничтожить?

Последний раз редактировалось Andrew McDrew, 11.07.2011 в 19:57.
Ответить с цитированием
  #2  
Старый 11.07.2011, 20:49
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Я не силен в интерфейсах, но вот что пишут умные люди:
Цитата:
Это происходит потому, что при выходе переменной, ссылающейся на интерфейс, за область видимости (либо при присвоении ей другого значения) компилятор Delphi генерирует код для вызова метода _Release, информируя реализацию о том, что ссылка на нее больше не нужна.
Ссылка
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 12.07.2011, 10:51
Andrew McDrew Andrew McDrew вне форума
Прохожий
 
Регистрация: 11.07.2011
Сообщения: 2
Репутация: 10
По умолчанию

Аа вот оно что. Там же написано что Делфи сама вызывает все что нужно и вообще сказано руками к методам IUnknown не прикасаться. Не знал, спасибо за помощь.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:04.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter