
21.07.2012, 00:19
|
 |
Продвинутый
|
|
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
|
|
Код:
uses
..., TlHelp32;
// Ваша функция:
function GetProcessFilePath(FName: string): string;
var
hProcess, hModule: integer;
PE32: PROCESSENTRY32;
PM: MODULEENTRY32;
begin
hProcess:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PE32.dwSize:=SizeOf(PROCESSENTRY32);
repeat
begin
hModule:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PE32.th32ProcessID);
PM.dwSize:=(SizeOf(MODULEENTRY32));
repeat
if PM.szModule=FName then
begin
Result:=PM.szExePath;
CloseHandle(hModule);
end;
until not (Module32Next(hModule, PM));
end;
until not (Process32Next(hProcess, PE32));
CloseHandle(hProcess);
end;
//==================================================================
function GetLastErrorString: string;
var
lz: Cardinal;
lErr: array[0..512] of Char;
begin
lz := GetLastError;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, lErr, 512, nil);
Result := string(lErr);
end;
//==================================================================
function GetProcessID(const AProcessName: string): DWord;
var
lSnapHandle: THandle;
lProcStruct: PROCESSENTRY32;
lProcessName, lSnapProcessName: string;
lOSVerInfo: TOSVersionInfo;
begin
Result := INVALID_HANDLE_VALUE;
lSnapHandle := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if lSnapHandle = INVALID_HANDLE_VALUE then
Exit;
lProcStruct.dwSize := SizeOf(PROCESSENTRY32);
lOSVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(lOSVerInfo);
case lOSVerInfo.dwPlatformId of
VER_PLATFORM_WIN32_WINDOWS: lProcessName := AProcessName;
VER_PLATFORM_WIN32_NT: lProcessName := ExtractFileName(AProcessName);
end;
if Process32First(lSnapHandle, lProcStruct) then
begin
try
repeat
lSnapProcessName := lProcStruct.szExeFile;
if AnsiUpperCase(lSnapProcessName) = AnsiUpperCase(lProcessName) then
begin
Result := lProcStruct.th32ProcessID;
Break;
end;
until not Process32Next(lSnapHandle, lProcStruct);
finally
CloseHandle(lSnapHandle);
end;
end;
end;
//==================================================================
function KillProcess(const AProcessName: string): Boolean;
var
lPID, lCurrentProcPID: DWord;
lProcHandle: DWord;
begin
Result := False;
try
lCurrentProcPID := GetCurrentProcessId;
lPID := GetProcessID(AProcessName);
if (lPID <> INVALID_HANDLE_VALUE) and (lCurrentProcPID <> lPID) then
begin
lProcHandle := OpenProcess(PROCESS_TERMINATE, False, lPID);
Windows.TerminateProcess(lProcHandle, 0);
WaitForSingleObject(lProcHandle, Infinite);
CloseHandle(lProcHandle);
Result := True;
end;
except
raise EExternalException.Create(GetLastErrorString);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
S: String;
begin
S := GetProcessFilePath('samp.exe');
if(FileExists(ExtractFilePath(S) + 'mod_sa.ini ')) then
KillProcess(S);
end;
ЗЫ Убить процесс можно и не так как в примере: можно найти его id и убить с помощью TerminateProcess, например.
__________________
Помогаю за Спасибо
|