Показать сообщение отдельно
  #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, что бы это значило? Кто-нибудь с таким сталкивался, знает как аккуратно все объекты уничтожить?
Ответить с цитированием