function GetPathFileOfModule(mModuleName: string): string;
var
vProcSnap: THandle;
vProcess: THandle;
vProcessEntry32: TProcessEntry32;
vBuffer: array[0..MAX_PATH] of char;
T: string;
L: Integer;
begin
Result := '';
vProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
mModuleName := UpperCase(mModuleName);
vProcessEntry32.dwSize := SizeOf(ProcessEntry32);
if Process32First(vProcSnap, vProcessEntry32) then
while Process32Next(vProcSnap, vProcessEntry32) do
begin
vProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
False, vProcessEntry32.th32ProcessID);
try
if GetModuleFileNameEx(vProcess, 0, vBuffer, SizeOf(vBuffer)) <> 0 then
T := vBuffer
else T := vProcessEntry32.szExeFile;
L := Length(mModuleName);
if FileExists(T) and
(Pos(mModuleName, UpperCase(T)) = Length(T) - L + 1) and
(Copy(T, Length(T) - L, 1) = '\') then
begin
Result := T;
Break;
end;
finally
CloseHandle(vProcess);
end;
end;
CloseHandle(vProcSnap);
end; { GetPathFileOfModule }
uses
TlHelp32,psapi;
function GetPathFileofModule(ModuleName:String):String;
var
hProcSnap: THandle;
pProcess: THandle;
pe32: TProcessEntry32;
s: string;
buf:array[0..MAX_PATH] of char;
hMod:HMODULE;
cbNeeded:DWORD;
begin
hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
if hProcSnap = INVALID_HANDLE_VALUE then Exit;
pe32.dwSize := SizeOf(ProcessEntry32);
if Process32First(hProcSnap, pe32) = True then
while Process32Next(hProcSnap, pe32) = True do
begin
if uppercase(pe32.szExeFile)=uppercase(ModuleName) then
begin
pProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or
PROCESS_VM_READ,
FALSE,
pe32.th32ProcessID);
if pProcess<>0 then
begin
if EnumProcessModules( pProcess,@hMod,sizeof(hMod),cbNeeded) then
begin
ZeroMemory(@buf,MAX_PATH+1);
GetModuleFileNameEx(pProcess, hMod,buf,MAX_PATH+1);
Result:=strpas(buf);
end;
end;
end;
end;
CloseHandle(hProcSnap);
end;
------------------------------------
调用方法:
ShowMessage(GetPathFileofModule('program.exe'));