Tausend Dank für Euer Engagement!
Nun, die Sache ließ mir keine Ruhe. Hier das vorläufige Ergebnis:
Ich benutze die beiden Funktionen (die erste stammt weitgehend von Luckie(s Programm „WinInfo“)) zur Ermittlung des Exe-Dateinamens eines Vordergrundfensters:
Delphi-Quellcode:
function GetExeStringFromProcID_Processsnapshot(PID:DWORD):string;
var hProcSnap:THandle;
pe32:TProcessEntry32;
begin
hProcSnap:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
if hProcSnap<>INVALID_HANDLE_VALUE then
begin
pe32.dwSize:=SizeOf(TProcessEntry32);
if Process32First(hProcSnap,pe32) then
begin
if pe32.th32ProcessID=PID then
begin
result:=ExtractFileName(pe32.szExeFile);//ohne Extraktion wird unter ME (jedes 9.x?) der gesamte Pfad zurückgeliefert
CloseHandle(hProcSnap);
exit
end;
while Process32Next(hProcSnap,pe32)do if pe32.th32ProcessID=PID then
begin
result:=ExtractFileName(pe32.szExeFile);
break
end
end;
CloseHandle(hProcSnap)
end;
end;
und (Luckies obige Funktion diente auch hier als Vorlage)
Delphi-Quellcode:
function GetExeStringFromProcID_Modulsnapshot(PID:DWORD):string; //stdcall;
var hModuleSnap:THandle;
me:TModuleEntry32;
begin
hModuleSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,PID);
if hModuleSnap<>INVALID_HANDLE_VALUE then
begin
me.dwSize:=SizeOf(TModuleEntry32);
if Module32First(hModuleSnap,me) then
begin
if uppercase(ExtractFileExt(me.szExePath))='.EXE' then
begin
result:=ExtractFileName(me.szExePath);
CloseHandle(hModuleSnap);
exit
end;
while Module32Next(hModuleSnap,me) do if lowercase(ExtractFileExt(me.szExePath))='.exe' then
begin
result:=ExtractFileName(me.szExePath);
break
end
end;
CloseHandle(hModuleSnap)
end
end;
Benutze ich die
unit „jwatlhelp32“, scheinen sie überhaupt nicht zu funktionieren. In erster Funktion sind alle „32.th32ProcessID“ gleich 0, was natürlich falsch ist (nur der Systemprozeß hat die Nr. 0). Die „me.szExePath“ liefern verstümelte Resultate, z.B. „er.exe“ beim „explorer.exe“ oder „rus.exe“ bei „lazarus.exe“.
Unter Windows 32 Bit, mit Lazarus 32 Bit compiliert, funktioniert aber alles tadellos! Die Funktion „CreateToolHelp32SnapShot“ funktioniert allerdings auch in der 32-Bit-Version unter Windows 64 Bit, wie ich anhand meines Programmes „Prozesse“ (auch hier im Forum abgelegt) feststellen konnte.
Setze ich Lazarus (64 Bit) die
unit „tlhelp32“ von Delphi 2.0 vor, scheint jetzt wenigstens der Modulschnappschuß zu funktionieren (weiß nicht, ob ich vorhin die gleiche
Unit oder doch „jwatlhelp32“ benutzte, der Prozeßschnappschuß immer noch nicht. Jedenfalls sind die Ergebnisse völlig inkonsistent, so daß ich allmählich einen Fehler im Free-Pascal-Compiler vermute.
Alles Rumgemache, die Variablentypen „DWORD“ und auch „THandle“ mit „Int64“ auszutauschen, auch, einen „Int64“, auch als Konstante schon an die Funktionen zu übergeben, brachten leider auch keinen Erfolg.
Zum Glück funktioneren die Hooks unter Windows 64 Bit. Diese Hooks sind allerdings der Grund, daß ich kein 32-Bit-Compilat unter Windows 64 Bit benutzen kann.