Здравствуйте.
Вопрос о изменении громкости в Винде начиная с Висты, там такие красивые интерфейсы, называется вроде 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, что бы это значило? Кто-нибудь с таким сталкивался, знает как аккуратно все объекты уничтожить?