فایل اجرایی یک پروسه همیشه اولین ماژول لود شده توسط اون پروسه هست، پس میشه با خواندن مشخصات اولین ماژول لود شده توسط پروسه، آدرس فایل اجرایی اون رو به دست آورد. برای این کار میشه از تایع Module32First استفاده کرد. اما روش مطمئن تر استفاده از تابع GetModuleFileNameEx با مقدار هندل 0 برای ماژول هست، که آدرس فایل اجرایی را از روی ماژول های لود شده مستقیما برگشت میده:
function GetProcessExeFileName(ProcessID: Cardinal): string;
var
hProcess: THandle;
begin
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,ProcessID);
if hProcess <> 0 then
begin
try
SetLength(Result,MAX_PATH);
FillChar(Result[1],Length(Result) * SizeOf(Char), 0);
if GetModuleFileNameEx(hProcess,0,PChar(Result),Lengt h(Result)) > 0 then
Result := Trim(Result)
else
RaiseLastOSError;
finally
CloseHandle(hProcess)
end;
end
else
RaiseLastOSError;
end;
این کد بخشی از کتابخانه ProcessInfo هست که قبلا در اینجا به اشتراک گذاشته بودم، دوباره سورسش رو پیوست می کنم.