AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Das Handle ist ungültig

Ein Thema von EWeiss · begonnen am 2. Mai 2018 · letzter Beitrag vom 6. Mai 2018
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: Das Handle ist ungültig

  Alt 2. Mai 2018, 13:35
Sieht gut aus..)

Muss das mal mit meiner Herangehensweise vergleichen.
Bin auch schon was weiter wenn auch mit ach und krach muss noch einiges optimiert werden.
Zum Beispiel scheint MS die SideBar zu kombinieren.

Bei mir wird für jedes das Sound enthält ein Control erstellt.

Danke.

gruss

Geändert von EWeiss (11. Jul 2019 um 15:51 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Das Handle ist ungültig

  Alt 2. Mai 2018, 14:06
Nope habe deine Funktion testweise mal eingebaut da kommt nichts an.
Beides bleibt leer.
...........
Dein Projekt ohne Änderung kompiliert D2010
Siehe das Ergebnis.

Sollte eigentlich den Namen und den IconPfad meiner Anwendung anzeigen.Tut's aber nicht.
Und wenn ich die Konsole vorher starte und anschließend ein Sound Programm stürzt das Konsolen teil ab.

Hmmm.. vielleicht lege ich das Projekt erst mal zur Seite.

Hier die Änderung damit es nicht mehr abstürzt.
Aber funktionieren tut es trotzdem nicht. (Win7 Problem? Keine Ahnung)
Delphi-Quellcode:
procedure PrintDefaultSessionControlDisplayName;
var
   DeviceEnumerator: IMMDeviceEnumerator;
   SessionManager: IAudioSessionManager;
   SessionManager2: IAudioSessionManager2;
   AudioDevice: IMMDevice;
   SessionControl2: IAudioSessionControl2;
   SessionEnumerator: IAudioSessionEnumerator;
   SessionControl: IAudioSessionControl;
   HR: HRESULT;
   SessionCount: Integer;
   pRetVal: PWideChar;
begin
   SessionCount := 0;

   HR := CoInitializeEx(nil, 0);
   if Succeeded(HR) then
   begin
     HR := CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_ALL, IID_IMMDeviceEnumerator, DeviceEnumerator);
     if Succeeded(HR) then
     begin
       HR := DeviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, 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.GetSession(SessionCount, SessionControl);
               if Succeeded(HR) then
               begin
                 if Supports(SessionControl, IID_IAudioSessionControl2, SessionControl2) then
                 begin
                   SessionControl2.GetDisplayName(pRetVal);
                   Writeln('DisplayName: ', pRetVal);
                   CoTaskMemFree(pRetVal);

                   SessionControl2.GetIconPath(pRetVal);
                   Writeln('IconPath: ', pRetVal);
                   CoTaskMemFree(pRetVal);
                 end;
                 SessionControl2 := nil;
               end;
               SessionControl := nil;
             end;
             SessionEnumerator := nil;
           end;
           SessionManager2 := nil;
         end;
         SessionManager := nil;
       end;
     end;
     DeviceEnumerator := nil;
     CoUninitialize;
   end;
end;
gruss

Geändert von EWeiss (11. Jul 2019 um 15:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.113 Beiträge
 
Delphi 12 Athens
 
#3

AW: Das Handle ist ungültig

  Alt 2. Mai 2018, 22:18
Bei mir wird es auch korrekt angezeigt, aber unter Windows 10. Windows 7 habe ich leider nicht zur Verfügung zum Testen.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 04:31
Bei mir wird es auch korrekt angezeigt, aber unter Windows 10. Windows 7 habe ich leider nicht zur Verfügung zum Testen.
seltsam
Ich kann machen was ich will beide WideChars ergeben immer .. nothing.

Ein
if Supports(SessionControl
Ist nicht unbedingt nötig denn wenn ich ein query auf SessionControl2 ausführe würde es wenn nicht unterstützt eh fehl schlagen.

so..
HR := SessionControl.QueryInterface(IAudioSessionControl2, SessionControl2);
oder so
if Supports(SessionManager, IID_IAudioSessionManager2, SessionManager2) then

bleibt sich gleich.
Mein Test bezieht sich auf das von mir korrigierte Obige Schnipsel.
Alle Test's schlagen fehl.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.113 Beiträge
 
Delphi 12 Athens
 
#5

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 05:39
seltsam
Ich kann machen was ich will beide WideChars ergeben immer .. nothing.
Ich habe es kurz mit "echten" Anwendungen getestet (hatte bisher immer nur den Systemsound aktiv), da steht in der Tat nichts drin. Also habe ich einfach mal in die Doku geschaut... und siehe da, das Verhalten ist so dokumentiert und vollkommen korrekt.

https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx
Zitat:
If the client has not called IAudioSessionControl::SetDisplayName to set the display name, the string will be empty. Rather than display an empty name string, the Sndvol program uses a default, automatically generated name to label the volume control for the audio session.
Wie es der Windows Mixer macht steht also auch direkt da, der geht vermutlich über die Process-ID.

GetSessionIdentifier gibt übrigens immer etwas zurück, auch unter Windows 7.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 06:47
Zitat:
Wie es der Windows Mixer macht steht also auch direkt da, der geht vermutlich über die Process-ID.
Ich mache nichts anderes.. und gehe ebenfalls nur über die ID.

Ich liste alle Prozesse auf addiere diese zu einer liste und prüfe ob irgendeiner davon
diese Bedingung erfüllt.

if State <> uint(TAudioSessionState.AudioSessionStateExpired) then
Zitat:
GetSessionIdentifier gibt übrigens immer etwas zurück, auch unter Windows 7.
Hmm... kleines Beispiele ?
Wenn du das meinst ? Ja!
Zitat:
SessionIdentifier = {0.0.0.00000000}.{e457a6b5-b413-4304-9b72-f8ba7de1d36a}|\Device\HarddiskVolume1\Program Files (x86)
Was ich bei @TiGü gesehen habe hatte vergessen DisplayName und IconPath frei zu geben.
CoTaskMemFree(pDisplayName); (Ok war\ist eh leer von daher erst mal egal)

Zitat:
und siehe da, das Verhalten ist so dokumentiert und vollkommen korrekt.
Korrekt ja laut Doku aber in meinen Augen.. sorry Schwachsinn.
Es wird also geprüft ob es sich um eine echte Anwendung handelt, wenn ja wird nix zurück gegeben um zu verhindern
das Developer den Mixer in dieser Art nachahmen können.
Diese Funktion ist dann einfach Nutzlos.

gruss

Geändert von EWeiss ( 3. Mai 2018 um 06:57 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 07:08
Mein Problem ist also..
Ich muss den DisplayNamen bzw.. den Pfad zum IconPath selbst vorher setzen.

Macht irgendwo keine sinn.
Es wären zwei funktionsaufrufe die letztendlich für die Katz sind wenn ich anschließend selbst noch das Icon bzw. den DisplayNamen selbst noch suchen muss.

Das würde also ausreichen.
Delphi-Quellcode:
FAudioSessionList[Index].DisplayName := pDisplayName;
if AudioSessionInfo(Index).DisplayName = 'then
  FAudioSessionList[Index].DisplayName := ExtractFileName
  (ChangeFileExt(GetBaseNameFromPID(PID), ''));
CoTaskMemFree(pDisplayName);
kann mir das dann schenken und muss anstelle dessen versuchen den Korrekten Namen zu analysieren.
GetBaseNameFromPID

Hmm.. was für ein schmarrn

gruss
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.081 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 08:53
Zitat:
und siehe da, das Verhalten ist so dokumentiert und vollkommen korrekt.
Korrekt ja laut Doku aber in meinen Augen.. sorry Schwachsinn.
Es wird also geprüft ob es sich um eine echte Anwendung handelt, wenn ja wird nix zurück gegeben um zu verhindern
das Developer den Mixer in dieser Art nachahmen können.
Diese Funktion ist dann einfach Nutzlos.
Kann es sein, dass du den von jaenicke zitierten Abschnitt nicht so ganz verstanden hast?
Hier nochmal auf Deutsch:

Zitat von MSDN:
Wenn der Client IAudioSessionControl::SetDisplayName nicht aufgerufen hat, um den Anzeigenamen zu setzen, ist der String leer.
Anstatt einen leeren Namenstring anzuzeigen, verwendet das Programm Sndvol einen automatisch generierten Standardnamen, um den Lautstärkeregler für die Audiositzung zu beschriften.

Was heißt das also?
Es besagt, dass es für Programme wie Skype, Chrome, Internet Explorer, FireFox, WinAmp, VLC KEINE Pflicht ist, das Interface IAudioSessionControl zu implementieren bzw. die Methode SetDisplayName aufzurufen.

Keine Ahnung, was du eigentlich bezwecken möchtest???
Wahrscheinlich setzt du einfach voraus, dass wir alle deine Beiträge lesen und wir daher genau wissen, woran du arbeitest und den Rest können wir uns gefälligst selber zusammenreimen.
Wäre ja auch noch schöner, ein vollständiges Gegeben, Gesucht und zumindest einen Lösungsansatz zu verlangen.

Möchtest eine der folgenden Informationen?

Code:
- - - - - - - - - - - - - - - - - -
SessionIndex:             0
SessionIdentifier:        {0.0.0.00000000}.{18e53891-8712-4c0d-9aab-e23e4b813b96}|#%b{A9EF3FD9-4240-455E-A4D5-F2B3301887B2}
SessionInstanceIdentifier: {0.0.0.00000000}.{18e53891-8712-4c0d-9aab-e23e4b813b96}|#%b{A9EF3FD9-4240-455E-A4D5-F2B3301887B2}|12%b#
DisplayName:              @%SystemRoot%\System32\AudioSrv.Dll,-202
IconPath:                 @%SystemRoot%\System32\AudioSrv.Dll,-203
Process ID:               0
- - - - - - - - - - - - - - - - - -
SessionIndex:             1
SessionIdentifier:        {0.0.0.00000000}.{18e53891-8712-4c0d-9aab-e23e4b813b96}|\Device\HarddiskVolume4\Program Files (x86)\Google\Chrome\Application\chrome.exe%b{00000000-0000-0000-0000-000000000000}
SessionInstanceIdentifier: {0.0.0.00000000}.{18e53891-8712-4c0d-9aab-e23e4b813b96}|\Device\HarddiskVolume4\Program Files (x86)\Google\Chrome\Application\chrome.exe%b{00000000-0000-0000-0000-000000000000}|12%b13524
DisplayName:
IconPath:
Process ID:               13524
ProcessName:              C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
- - - - - - - - - - - - - - - - - -
SessionIndex:             2
SessionIdentifier:        {0.0.0.00000000}.{18e53891-8712-4c0d-9aab-e23e4b813b96}|\Device\HarddiskVolume4\Program Files (x86)\Skype\Phone\Skype.exe%b{00000000-0000-0000-0000-000000000000}
SessionInstanceIdentifier: {0.0.0.00000000}.{18e53891-8712-4c0d-9aab-e23e4b813b96}|\Device\HarddiskVolume4\Program Files (x86)\Skype\Phone\Skype.exe%b{00000000-0000-0000-0000-000000000000}|12%b184
DisplayName:
IconPath:
Process ID:               184
ProcessName:              C:\Program Files (x86)\Skype\Phone\Skype.exe
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz