Thema: Delphi Das Handle ist ungültig

Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#49

AW: Das Handle ist ungültig

  Alt 4. Mai 2018, 10:04
Erzeugst du die visuellen Elemente aufgrund der Größe des Rückgabewertes von TAudioVolume.GetSessionCount oder aufgrund der Länge des Arrays FAudioSessionList?

Sind diese Zeilen noch aktuell oder inzwischen auch geändert/auskommentiert?

Delphi-Quellcode:
 
  HR := pEnumerator.GetCount(FSessionCount);
  Succeeded(HR) then
   SetLength(FAudioSessionList, FSessionCount + 1);
aufgrund von des Arrays FAudioSessionList TAudioVolume.GetSessionCount deshalb das SCount
Es wurden so viele Elemente erstellt wie Session <> AudioSessionStateExpired

Also meine Änderung die ich aktuell verwende damit du nicht raten musst.. sorry.
Habe es mal mit deinem Schnipsel versucht das gleiche Spiel.
Nur als Gegenprobe zu meiner Version.

Delphi-Quellcode:
function TAudioVolume.GetSessionCount: integer;
var
  DeviceEnumerator: IMMDeviceEnumerator;
  SessionManager: IAudioSessionManager;
  SessionManager2: IAudioSessionManager2;
  AudioDevice: IMMDevice;
  SessionEnumerator: IAudioSessionEnumerator;
  SessionControl: IAudioSessionControl;
  SessionCount: Integer;
  HR: HResult;
begin

  Result := 0;
  SessionCount := 0;

  HR := CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_ALL, IID_IMMDeviceEnumerator, DeviceEnumerator);
  if Succeeded(HR) then
  begin
    HR := DeviceEnumerator.GetDefaultAudioEndpoint(eRender, eMultimedia, AudioDevice);
    if Succeeded(HR) then
    begin
      HR := AudioDevice.Activate(IID_IAudioSessionManager, CLSCTX_INPROC_SERVER, nil, IUnknown(SessionManager));
      if Succeeded(HR) then
      begin
        if Supports(SessionManager, IID_IAudioSessionManager2, SessionManager2) then
        begin
          HR := SessionManager2.GetSessionEnumerator(SessionEnumerator);
          if Succeeded(HR) then
          begin
            HR := SessionEnumerator.GetCount(SessionCount);
            if Succeeded(HR) then
            begin
              Setlength(FAudioSessionList, SessionCount + 1);
              Result := SessionCount;
            end;
            SessionControl := nil;
          end;
          SessionEnumerator := nil;
        end;
        SessionManager2 := nil;
      end;
      SessionManager := nil;
    end;
    AudioDevice := nil;
  end;
  DeviceEnumerator := nil;
end;
Delphi-Quellcode:
function TAudioVolume.GetSessionPID(Index: Integer; AudioDevice: IMMDevice): DWORD;
var
  SessionControl2: IAudioSessionControl2;
  SessionControl: IAudioSessionControl;
  pEnumerator: IAudioSessionEnumerator;
  PID: DWORD;
  HR: HResult;
begin
  Result := 0;

  if Assigned(SessionManager2) then
  begin
    HR := AudioDevice.Activate(IID_IAudioSessionManager2, CLSCTX_ALL, nil, IUnknown(SessionManager2)
      );
    if Succeeded(HR) then
    begin
      HR := SessionManager2.GetSessionEnumerator(pEnumerator);
      if Succeeded(HR) then
      begin
        HR := pEnumerator.GetSession(Index, SessionControl);
        if Succeeded(HR) then
        begin
          HR := SessionControl.QueryInterface(IAudioSessionControl2, SessionControl2);
          if Succeeded(HR) then
          begin
            HR := SessionControl2.GetProcessID(PID);
            if Succeeded(HR) then
              Result := PID;
          end;
        end;
      end;
    end;
  end;
end;
Bei deiner Version gibt mir sessioncount 0 zurück weil ich das AudioDevice neu initialisiere.

Nach jeden Neustart der Anwendung addiert sich der Count über SessionEnumerator.GetCount(SessionCount); um 1!
Das verstehe wer will.
Die Anzahl der Session unter Windows im, Mixer bleiben aber gleich.

gruss

Geändert von EWeiss ( 4. Mai 2018 um 10:20 Uhr)
  Mit Zitat antworten Zitat