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
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 11:46
Ich werfe einfach mal was in den Raum obwohl ich mir nicht 100%ig sicher bin ob das relevant ist.
Kann es vllt. ein 32-Bit <-> 64-Bit Problem sein, dass du in deiner 32-Bit Anwendung vllt. keine 64-Bit Prozesse öffnen kannst/darfst?

Sowas kam mir nur in den Kopf.. kann aber durchaus sein, dass ich Unsinn rede.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 11:50
Ich werfe einfach mal was in den Raum obwohl ich mir nicht 100%ig sicher bin ob das relevant ist.
Kann es vllt. ein 32-Bit <-> 64-Bit Problem sein, dass du in deiner 32-Bit Anwendung vllt. keine 64-Bit Prozesse öffnen kannst/darfst?

Sowas kam mir nur in den Kopf.. kann aber durchaus sein, dass ich Unsinn rede.
Wäre möglich aber um das genau feststellen zu können müsste man das Projekt nach 64Bit Portieren.
Nur dafür fehlen mir die Möglichkeiten.

Auf der anderen Seite dürfte dann gar nichts gehen denn ich denke das die API ja letztendlich auch auf die 64Bit Prozesse der Soundkarten Treiber zugreift oder?
Oder aber die werden umgelenkt. Dann müsste es aber funktionieren.

gruss

Geändert von EWeiss ( 3. Mai 2018 um 11:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 11:58
Kann es vllt. ein 32-Bit <-> 64-Bit Problem sein, dass du in deiner 32-Bit Anwendung vllt. keine 64-Bit Prozesse öffnen kannst/darfst?
MSDN-Library durchsuchenOpenProcess ist unproblematisch. Es gibt aber tatsächlich einige APIs, welche da Probleme bereiten. Alles was intern MSDN-Library durchsuchenZwReadVirtualMemory bzw. MSDN-Library durchsuchenReadProcessMemory verwendet, sind dafür beispielsweise Kandidaten. Hierzu zählt auch die verwendete MSDN-Library durchsuchenGetModuleFilenameEx API.

Siehe hier:
https://www.delphipraxis.net/160046-...ermitteln.html (Konvertierung vom NT-Pfad zu standard DOS-Pfad kann man sich hier auch anschauen)

Edit:
Habe grade unter Win10 nochmal geschaut (mein Post von damals ist ja schon ein wenig in die Jahre gekommen) und das Verhalten hat sich scheinbar geändert. Mitlerweile funktioniert GetModuleFilenameEx wohl auch bei 64-Bit Prozessen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 3. Mai 2018 um 12:05 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 12:04
Danke dir werde mir das mal anschauen.

EDIT:
Also kein Problem scheint zu funktionieren.
Auch das Icon bekomme ich nun. Muss das jetzt erst mal zuweisen um das Ergebnis sehen zu können.

gruss

Geändert von EWeiss ( 3. Mai 2018 um 12:19 Uhr)
  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, 12:56
Delphi-Quellcode:
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;
Warum eigentlich der Vergleich von PID mit der ProcID, die du über die gefüllte ProcList holst? Wozu dient das?
Die PID, die du mit SessionControl2.GetProcessID(PID); ermittelst, gibt dir doch eine gültige Process ID einer Audiosession?

Der ieexplore lässt sich ohne große Verrenkungen per OpenProcess ermitteln:
Code:
SessionIndex:             2
SessionIdentifier:        {0.0.0.00000000}.{18e53891-8712-4c0d-9aab-e23e4b813b96}|#%b{63C9CE85-D9FF-4AE9-A105-C25B9A69E0C8}
SessionInstanceIdentifier: {0.0.0.00000000}.{18e53891-8712-4c0d-9aab-e23e4b813b96}|#%b{63C9CE85-D9FF-4AE9-A105-C25B9A69E0C8}|12%b#
DisplayName:
IconPath:
Process ID:               5444
ProcessName:              C:\Program Files (x86)\Internet Explorer\iexplore.exe
ProcessName wird über OpenProcess() und GetModuleFileNameEx() geholt.

Geändert von TiGü ( 3. Mai 2018 um 13:02 Uhr)
  Mit Zitat antworten Zitat
TiGü

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

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 13:01
Du solltest deiner TAudioVolume.GetPathFromPID Methode in der ersten Zeile übrigens ein Result := ''; gönnen. Sicher ist sicher!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 13:09
Du solltest deiner TAudioVolume.GetPathFromPID Methode in der ersten Zeile übrigens ein Result := ''; gönnen. Sicher ist sicher!
Wie gesagt ich schicke dir das Projekt gerne zu dann kannst sehen was abgeht. (PN mit Mail sollte reichen)
Da ist noch einiges im argen.

Habe ich geändert die wird nicht mehr verwendet.

gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Das Handle ist ungültig

  Alt 4. Mai 2018, 02:49
Zitat:
Warum eigentlich der Vergleich von PID mit der ProcID, die du über die gefüllte ProcList holst? Wozu dient das?
Die PID, die du mit SessionControl2.GetProcessID(PID); ermittelst, gibt dir doch eine gültige Process ID einer Audiosession?
Hier das Pic was ich bekomme wenn ich nicht die PID mit der ProcID vergleiche.
Ist schon seltsam das ganze

Frage mich was machen die Folder in der Liste.
Zitat:
Active Session = 1
DisplayName =
StateSession = AudioSessionStateInactive

IconPath =

SessionIdentifier = {0.0.0.00000000}.{e457a6b5-b413-4304-9b72-f8ba7de1d36a}|\Device\HarddiskVolume1\Program Files (x86)\TAudioVolume\Demo_Eng\AudioVolumeAdj_Eng.exe %b{00000000-0000-0000-0000-000000000000}

ProcessID = 876
IsSystemSoundsSession = 1

SessionGuid = {3502FB3B-A396-417B-AC93-9D135913288D}
Den Prozess AudioVolumeAdj_Eng.exe hatte ich eigentlich ausgeschlossen.
if PID <> GetCurrentProcessId) then Da ist noch einiges im Argen. LOL
Was real ist und was nicht.. der vergleich.
Und nach jedem Neustart sieht das anders aus.

Den SystemSound bekomme ich nicht.
Die sidebar ist doppelt und dreifach.. und AudioVolumeAdj_Eng wird als Folder angezeigt.

gruss

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

n/a Beiträge
 
#9

AW: Das Handle ist ungültig

  Alt 3. Mai 2018, 13:07
Zitat:
Warum eigentlich der Vergleich von PID mit der ProcID, die du über die gefüllte ProcList holst? Wozu dient das?
Warum? Weil ich die Lautstärke vom gesamten System und die der Anwendungs Lautstärke aus den Session ausschließen möchte.
Die werden immer erstellt unabhängig von einer Aktiven oder Inaktiven Session.

Ich habe jetzt die Icons und das mit dem aufsuchen der Anwendungen selbst funktioniert mit der Lösung von Zacherl gut.

Zitat:
ProcessName wird über OpenProcess() und GetModuleFileNameEx() geholt.
Wie gesagt hatte da immer ein ungültiges Handle aber nicht mit Zacherl's Funktion.

Ka hast du W10?

Die Icons sind im Moment nur Zentriert die höhe der Controls ist noch nicht angepasst.
Das mit den doppelten Sidebar Session ist auch noch nicht behoben. (Muss nachdenken wie ich das am besten mache ohne viele Aufwand)

EDIT:
Zudem wenn ich diese nicht vergleichen würde müsste ich die komplette liste mit
State <> uint(TAudioSessionState.AudioSessionStateExpired)
vergleichen und das kann dauern je nachdem wie viele Prozesse am laufen sind.

So vergleiche ich den Aktiven Prozess vorher mit der PID die über
SessionControl2.GetProcessID(PID);
ermittelt wurde.

Somit muss ich NUR maximal 9 abfragen und nicht 100 und mehr.

gruss

Geändert von EWeiss (11. Jul 2019 um 15:51 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 04:06 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