![]() |
AW: Das Handle ist ungültig
Zitat:
Delphi-Quellcode:
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: ![]() |
AW: Das Handle ist ungültig
Zitat:
Zitat:
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:
Sonst würde ja alles funktionieren. Anwendung..
Delphi-Quellcode:
AudioVolume[i].GetSessionCount(AudioVolume1.Device);
if AudioVolume1.AudioSessionInfo(i).PID <> 0 then
Delphi-Quellcode:
Ok hier GetSessionCount muss ich noch was tun es dauert einfach zu lange für jedes control diese Funktion zu durchlaufen.
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; gruss |
AW: Das Handle ist ungültig
Ich gab Dir
![]() |
AW: Das Handle ist ungültig
Zitat:
Ich sagte doch schon das habe ich alles schon durch deshalb habe ich doch den Thread hier erstellt. Ich sammle auch nicht die Funktionen andere Leute sondern erarbeite sie selbst. Es hat bei meiner Funktion
Delphi-Quellcode:
gekracht wegen ungültigen Handle.
function TAudioVolume.GetPathFromPID(const PID: DWORD): string;
var hProcess: THandle; path: array [0 .. MAX_PATH - 1] of WChar; begin hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID); if hProcess <> 0 then try if GetModuleFileNameEx(hProcess, 0, path, MAX_PATH) = 0 then RaiseLastOSError; Result := path; finally CloseHandle(hProcess) end else RaiseLastOSError; end; Bei der Sidebar und dem IExplorer bei normalen Anwendungen seltsamer weise nicht. gruss |
AW: Das Handle ist ungültig
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. |
AW: Das Handle ist ungültig
Zitat:
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 |
AW: Das Handle ist ungültig
Zitat:
![]() ![]() ![]() ![]() Siehe hier: ![]() 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. |
AW: Das Handle ist ungültig
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 |
AW: Das Handle ist ungültig
Delphi-Quellcode:
Warum eigentlich der Vergleich von PID mit der ProcID, die du über die gefüllte ProcList holst? Wozu dient das?
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; 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:
ProcessName wird über OpenProcess() und GetModuleFileNameEx() geholt.
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 |
AW: Das Handle ist ungültig
Du solltest deiner
Delphi-Quellcode:
Methode in der ersten Zeile übrigens ein
TAudioVolume.GetPathFromPID
Delphi-Quellcode:
gönnen. Sicher ist sicher!
Result := '';
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 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