Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
Delphi 10.4 Sydney
|
AW: Das Handle ist ungültig
2. Mai 2018, 11:25
Versuch mal anstatt GetModuleBaseName die Funktion GetProcessImageFileNameW.
Beispiel:
Delphi-Quellcode:
program Project3;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Winapi.Windows,
PsAPI;
function GetProcessImageFileNameW(hProcess: THandle; lpBaseName: LPCWSTR; nSize: DWORD): DWORD; stdcall; external ' PSAPI.dll';
function GetBaseNameFromPID( const PID: DWORD): string;
var
hProcess: THandle;
LModule: HMODULE;
path: array [0 .. MAX_PATH - 1] of WideChar;
ErrorTxt: array [0 .. 500] of WideChar;
begin
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);
if hProcess <> 0 then
try
LModule := 0;
path := ' ';
// if GetModuleBaseName(hProcess, LModule, path, MAX_PATH) = 0 then
if GetProcessImageFileNameW(hProcess, path, MAX_PATH) = 0 then
begin
ErrorTxt := ' ';
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, GetLastError, 0, ErrorTxt, 500, nil);
Writeln(ErrorTxt);
// RaiseLastOSError;
end;
Result := path;
finally
CloseHandle(hProcess)
end
else
RaiseLastOSError;
end;
var
gPID: DWORD;
gName: string;
begin
try
while True do
begin
Writeln(' Bitte PID eingeben');
Readln(gPID);
gName := GetBaseNameFromPID(gPID);
Writeln(gName);
end;
except
on E: Exception do
begin
Writeln(E.ClassName, ' : ', E. Message);
Readln;
end;
end;
end.
|
|
Zitat
|