Und noch eine Version:
Delphi-Quellcode:
uses
tlhelp32;
function GetParentID(ID: DWORD; var IDParent: DWORD): DWORD;
var
hSnapShot: THandle;
pe32: TProcessEntry32;
begin
hSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hSnapShot <> 0 then
begin
pe32.dwSize := sizeof(TProcessEntry32);
if Process32First(hSnapShot, pe32) then
begin
repeat
if pe32.th32ProcessID = GetCurrentProcessId then
begin
IDParent := pe32.th32ParentProcessID;
break;
end;
until Process32Next(hSnapShot, pe32) = False;
end;
CloseHandle(hSnapShot);
end;
result := GetLastError;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ParentID: DWORD;
dwReturn: DWORD;
begin
dwReturn := GetParentID(GetCurrentProcessId, ParentID);
if dwReturn = 0 then
ShowMessage(IntToStr(ParentID))
else
ShowMessage(SysErrorMessage(dwReturn));
end;
@mpth:
API Funktionen lösen keine Exceptions aus. Das try-finally Konstrukt ist also überflüssig. Und ohne zu prüfen, ob du ein gültiges
Handle hast, ist es nicht ratsam in die Schleife zu gehen. Desweiteren vermisse ich bei dir eine Fehlerbehandlung. Ich weiß immer gerne, warum etwas nicht funktioniert hat, wenn ein Fehler aufgetreten ist. Meine Funktion liefert den letzten Systemfehler des Pozesses zurück, den man dann auswerten kann.