|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Странности с 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; Так вот, если раскомментить хоть один релиз, то при отладке все вроде нормально отрабатывает, а если запустить ехе отдельно то вылетает АкцессВиолейшн и адреса бывают как полный 00000000 или около него так и FFFFFFFF. Покопал шоумесседжами, вылетает оно на втором прохождении цыкла на команде Devise.Activate. Вроде гдето писали что 0 значит что обращаюсь к несуществующему обьекту, а большое число -- к уже уничтоженному. Но чего спрашивается вылетать если раскомментить только последний интерфейс DeviceCollection._Release(правда здесь не на Активейт) ?? Да и что характерно DeviceCollection._Release и EndpointVolume._Release возвращают 0, походу все на объект ссылок больше нет и оно самоуничтожается, зато остальные возвращают 1, что бы это значило? Кто-нибудь с таким сталкивался, знает как аккуратно все объекты уничтожить? Последний раз редактировалось Andrew McDrew, 11.07.2011 в 19:57. |
#2
|
||||
|
||||
Я не силен в интерфейсах, но вот что пишут умные люди:
Цитата:
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
|||
|
|||
Аа вот оно что. Там же написано что Делфи сама вызывает все что нужно и вообще сказано руками к методам IUnknown не прикасаться. Не знал, спасибо за помощь.
|