|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Ребят, тут такое дело...
Короче говоря мне нужно сделать так, чтоб призапуске процесса samp.exe, моя прога находила папку где находится этот файл(Папку с gta sa mp) и если есть в этой папке файл mod_sa.ini то закрывало процесс samp.exe, а если его нет - ничего не делала.
Знакомый написал, что нужно написать вот такую функцию Код:
Alexandr 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; 20:18:36 s:=GetProcessFilePath('samp.exe'); l:= Copy(s, 1, Length(s)-8); где gta_sa.exe смени на самп L:string S тоже вот тебе и папка gta в переменной L |
#2
|
||||
|
||||
Код:
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, например. Помогаю за Спасибо Последний раз редактировалось v1s2222, 21.07.2012 в 00:23. |
Этот пользователь сказал Спасибо v1s2222 за это полезное сообщение: | ||
Flop88 (21.07.2012)
|