Mit GetProcessImageFileName funktioniert es auch mit 64bit Prozessen. Statt SizeOf(buffer1) solltest du unbedingt Length(buffer1) schreiben, dann geht es auch mit Delphi 2009 und neuer.
Delphi-Quellcode:
function GetProcessImageFileName(
// ab XP
hProcess: tHANDLE;
lpImageFileName: LPTSTR;
nSize: DWORD): DWORD;
stdcall;
external '
psapi.dll'
name '
GetProcessImageFileName'+
{$IFDEF UNICODE}'
W'
{$ELSE}'
A'
{$ENDIF};
function GetProcessFilePath(pid:cardinal):
string;
var
hp: THandle;
Buffer1:
array[0..MAX_PATH]
of Char;
Len: DWORD;
begin
Result := '
';
if pid > 0
then
begin
hp := OpenProcess(PROCESS_QUERY_INFORMATION, False, pid);
if hp > 0
then
try
Len := GetProcessImageFileName(hp, buffer1, Length(buffer1));
if Len > 0
then
Result := Copy(buffer1, 1, Len)
else
Result := SysErrorMessage(GetLastError);
finally
CloseHandle(hp);
end;
end;
end;