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
Seite 3 von 10     123 45     Letzte »    
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#21

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 06: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
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#22

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 07: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 07:57 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#23

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 08: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.070 Beiträge
 
Delphi 10.4 Sydney
 
#24

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 09: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
EWeiss
(Gast)

n/a Beiträge
 
#25

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 10:23
Zitat:
Kann es sein, dass du den von jaenicke zitierten Abschnitt nicht so ganz verstanden hast?
Habe ich!
Zitat:
Ich muss den DisplayNamen bzw.. den Pfad zum IconPath selbst vorher setzen.
Du hast schon gesehen das ich es mit meinem Programm teste?
Also muss ich hier den DisplayNamen und den Pfad zum Icon selber setzen.. Ist das jetzt deutlich genug?

Zitat:
Möchtest eine der folgenden Informationen?
Die habe ich selber.. wenn du meinen Shot angeschaut hättest wäre es dir aufgefallen.

Du musst mich auch nicht auf diese Art hier belehren das mag ich gar nicht!.
Zudem bringen mir deine Infos nichts denn die Strings bleiben wie zuvor leer.

Auch wenn bsp. Winamp
Zitat:
VLC KEINE Pflicht ist, das Interface IAudioSessionControl zu implementieren bzw. die Methode SetDisplayName aufzurufen.
es nicht implementiert kommt MS mit seinem Mixer an den Namen sowie das Icon heran.

Zum IExplorer habe ich ja schon einen Shot geschickt. (Es geht also)
So nun mit all deinen klugen Sprüchen (Belehrungen) wenn MS es kann warum funktioniert es dann nicht bei mir?

Ach vergiss es einfach.. Ich finde eine Lösung dessen kannst du sicher sein!

gruss

Geändert von EWeiss ( 3. Mai 2018 um 10:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 10:27
Auch wenn bsp. Winamp
Zitat:
VLC KEINE Pflicht ist, das Interface IAudioSessionControl zu implementieren bzw. die Methode SetDisplayName aufzurufen.
es nicht implementiert kommt MS mit seinem Mixer an den Namen sowie das Icon heran.
Richtig, aber eben nicht über eine fertige API, sondern indem es selbst eine passende Beschriftung ermittelt, wie es ja auch in der Doku steht, ich vermute z.B. aus dem Prozessnamen, Fenstertiteln oder ähnlichem.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#27

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 10:31
Auch wenn bsp. Winamp
Zitat:
VLC KEINE Pflicht ist, das Interface IAudioSessionControl zu implementieren bzw. die Methode SetDisplayName aufzurufen.
es nicht implementiert kommt MS mit seinem Mixer an den Namen sowie das Icon heran.
Richtig, aber eben nicht über eine fertige API, sondern indem es selbst eine passende Beschriftung ermittelt, wie es ja auch in der Doku steht, ich vermute z.B. aus dem Prozessnamen, Fenstertiteln oder ähnlichem.
Danke und genau das bin ich am versuchen wenn der Name\Pfad zum Icon Leer ist.
Was ich möchte.. das TAudioVolume auf einen Kompletten Mixer erweitern so wie er sichtbar wird wie wenn man im Tray auf das Lautsprecher Symbol klickt.

EDIT:
Schlage mich jetzt mit der Änderung rum.
Durch die Änderung auf GetProcessImageFileNameW habe ich nun Probleme den korrekten Pfad zu Anwendung zu finden um das Icon zu setzen.
Muss diesen Pfad
Zitat:
\Device\HarddiskVolume1\Program Files\Windows Sidebar\sidebar.exe
in einem gültigen umwandeln.

Und so geht es immer weiter..

Delphi-Quellcode:
a := MAX_PATH;
GetVolumePathNamesForVolumeNameW(PWideChar(FAudioSessionList[Index].IconPath),
  @FullPath, MAX_PATH, a);

SetSysItemIcon(FullPath);
FullPath ist leer..

gruss

Geändert von EWeiss ( 3. Mai 2018 um 10:45 Uhr)
  Mit Zitat antworten Zitat
TiGü

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

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 10:48
Zitat:
...wenn MS es kann warum funktioniert es dann nicht bei mir?
Spruch des Tages, Internet kann zu!


Du hast den vollständigen Processpfad/-dateinamen, du hast das Process Handle, du hast die Process ID...woran scheitert es jetzt genau?

Hier noch ein Schups in die richtige Richtung, weil heute Donnerstag ist:

Delphi-Quellcode:
procedure ExtractIcons(const FileName: string);
var
  IconCount: Cardinal;
  I: Integer;
  IconHandle: HICON;
begin
  IconCount := ExtractIcon(HInstance, PChar(FileName), UINT(-1));
  if IconCount <> 0 then
  begin
    for I := 0 to IconCount - 1 do
    begin
      IconHandle := ExtractIcon(HInstance, PChar(FileName), I);
      if IconHandle <> 0 then
      begin
        // mach irgendwas mit dem Icon Handle
        // . . .

        // am Ende freigeben
        DestroyIcon(IconHandle);
      end;
    end;
  end;
end;
  Mit Zitat antworten Zitat
TiGü

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

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 10:51
EDIT:
Schlage mich jetzt mit der Änderung rum.
Durch die Änderung auf GetProcessImageFileNameW habe ich nun Probleme den korrekten Pfad zu Anwendung zu finden um das Icon zu setzen.
Muss diesen Pfad
Zitat:
\Device\HarddiskVolume1\Program Files\Windows Sidebar\sidebar.exe
in einem gültigen umwandeln.
Delphi-Quellcode:
                      SessionControl2.GetProcessId(ProcessId);
                      Writeln('Process ID: ', ProcessId);

                      ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessId);
                      if ProcessHandle <> 0 then
                      begin
                        if GetModuleFileNameEx(ProcessHandle, 0, ProcessName, MAX_PATH) <> 0 then
                        begin
                          Writeln('ProcessName: ', ProcessName);
                        end;
                        CloseHandle(ProcessHandle);
                      end;
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#30

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 10:56
EDIT:
Schlage mich jetzt mit der Änderung rum.
Durch die Änderung auf GetProcessImageFileNameW habe ich nun Probleme den korrekten Pfad zu Anwendung zu finden um das Icon zu setzen.
Muss diesen Pfad
Zitat:
\Device\HarddiskVolume1\Program Files\Windows Sidebar\sidebar.exe
in einem gültigen umwandeln.
Delphi-Quellcode:
                      SessionControl2.GetProcessId(ProcessId);
                      Writeln('Process ID: ', ProcessId);

                      ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessId);
                      if ProcessHandle <> 0 then
                      begin
                        if GetModuleFileNameEx(ProcessHandle, 0, ProcessName, MAX_PATH) <> 0 then
                        begin
                          Writeln('ProcessName: ', ProcessName);
                        end;
                        CloseHandle(ProcessHandle);
                      end;
Das hatten wir schon Seiten vorher... aber trotzdem Danke.
Nicht nur GetModuleBaseName (gibt den ExeNamen ohne Pfad zurück) verursacht diesen Fehler auch GetModuleFileNameEx (ExeNamen inklusive Pfad)

Hier gibt es den Fehler das mein Handle ungültig ist.
Deshalb haben wir es doch geändert.

Zitat:
Hier noch ein Schups in die richtige Richtung, weil heute Donnerstag ist:
Danke hatte ich schon fertig.. und ist mir bekannt.
Delphi-Quellcode:
procedure TAudioVolume.SetSysItemIcon(wsItems: PWideChar);
var
  fi: TSHFileInfo;
begin

  ZeroMemory(@fi, sizeof(TSHFileInfo));
  if SHGetFileInfo(wsItems, 0, fi, sizeof(TSHFileInfo),
    SHGFI_DISPLAYNAME Or SHGFI_SYSICONINDEX or SHGFI_LARGEICON or SHGFI_ICON) <> 0 then

  Icon := fi.HICON;

end;
gruss

Geändert von EWeiss ( 3. Mai 2018 um 11:03 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 10     123 45     Letzte »    


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 21:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz