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 3. Mai 2018, 09: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 09:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: Das Handle ist ungültig

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

n/a Beiträge
 
#3

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 09: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 09:45 Uhr)
  Mit Zitat antworten Zitat
TiGü

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

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 09: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.079 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 09: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
 
#6

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 09: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 10:03 Uhr)
  Mit Zitat antworten Zitat
TiGü

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

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 10:17
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.
Gehen wir nochmal ganz doll zurück zum ersten Beitrag:

FAudioSessionList[Index].DisplayName := GetBaseNameFromPID(PID);

Woher kommt die Variable PID? Oder um die Frage vielleicht klarer zu stellen: Wie ermittelst du den Wert von PID?
Wenn die Process ID gültig ist - also wie von mir gezeigt per einzelner SessionControl-Instanz geholt - dann muss OpenProcess ein gültiges Handle liefern.

Ansonsten machst du was falsch.
Laufen die Programme vielleicht als Administrator ("Als Administrator ausführen")? Dann kann OpenProcess so nicht funktionieren.

Vergleiche mit Konsolenausgabe in Beitrag #24:
https://www.delphipraxis.net/1401141-post24.html
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 10:27
Zitat:
Laufen die Programme vielleicht als Administrator ("Als Administrator ausführen")? Dann kann OpenProcess so nicht funktionieren.
IExplorer und SideBar? denke schon.

Zitat:
Woher kommt die Variable PID? Oder um die Frage vielleicht klarer zu stellen: Wie ermittelst du den Wert von PID?
Delphi-Quellcode:
            HR := SessionControl2.GetProcessID(PID);
            if Succeeded(HR) then
            begin
              FAudioSessionList[Index].ProcessID := intToStr(PID);
              HR := SessionControl2.GetState(State);
              if Succeeded(HR) then
              begin
                if PID = ProcId then
                begin
                  if State <> uint(TAudioSessionState.AudioSessionStateExpired) then
                  begin
Zitat:
Ansonsten machst du was falsch.
möglich
Sonst würde ja alles funktionieren.

Anwendung..
Delphi-Quellcode:
    AudioVolume[i].GetSessionCount(AudioVolume1.Device);
    if AudioVolume1.AudioSessionInfo(i).PID <> 0 then
Delphi-Quellcode:
function TAudioVolume.GetSessionCount(AudioDevice: IMMDevice): integer;
var
  SessionControl2: IAudioSessionControl2;
  SessionControl: IAudioSessionControl;
  pEnumerator: IAudioSessionEnumerator;
  SCount: Integer;
  PID, ProcId: DWORD;
  State: uint;
  HR: HResult;
  i, j: integer;
  ProcList: TStringList;
begin

  ProcList := TStringList.Create;
  SCount := 0;

  GetProzessList(ProcList);
  if Assigned(SessionManager2) then
  begin
    HR := AudioDevice.Activate(IID_IAudioSessionManager2, CLSCTX_ALL, nil, IUnknown(SessionManager2)
      );
    if Succeeded(HR) then
    begin
      // get SessionQuery
      HR := SessionManager2.GetSessionEnumerator(pEnumerator);
      if Succeeded(HR) then
      begin
        HR := pEnumerator.GetCount(FSessionCount);
        if Succeeded(HR) then
          Setlength(FAudioSessionList, FSessionCount + 1);
        if Succeeded(HR) then
        begin
          for i := 0 to FSessionCount - 1 do
          begin
            HR := pEnumerator.GetSession(i, SessionControl);
            if Succeeded(HR) then
            begin
              HR := SessionControl.QueryInterface(IAudioSessionControl2, SessionControl2);
              if Succeeded(HR) then
              begin
                HR := SessionControl2.GetProcessID(PID);
                if Succeeded(HR) then
                begin
                  HR := SessionControl2.GetState(State);
                  if Succeeded(HR) then
                  begin
                    for j := 0 to ProcList.Count - 1 do
                    begin
                      ProcId := GetProcessIdFromModuleName(pWideChar(ProcList[j]));
                      if (PID = ProcId) and (PID <> GetCurrentProcessId) then
                      begin
                        if State <> uint(TAudioSessionState.AudioSessionStateExpired) then
                        begin
                          FAudioSessionList[i].ActiveSession := IntToStr(i);
                          FAudioSessionList[i].PID := PID;
                          inc(SCount, i);
                        end;
                      end;
                    end;
                  end;
                end;
              end;
              SessionControl2 := nil;
            end;
            SessionControl := nil;
          end;
        end;
      end;
      pEnumerator := nil;
    end;
  end;
  ProcList.free;
  Result := SCount;
end;
Ok hier GetSessionCount muss ich noch was tun es dauert einfach zu lange für jedes control diese Funktion zu durchlaufen.

gruss

Geändert von EWeiss ( 3. Mai 2018 um 11:07 Uhr)
  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 05:49 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