Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.07.2012, 00:07
Flop88 Flop88 вне форума
Прохожий
 
Регистрация: 30.04.2012
Сообщения: 34
Репутация: 10
Восклицание Ребят, тут такое дело...

Короче говоря мне нужно сделать так, чтоб призапуске процесса 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  
Старый 21.07.2012, 00:19
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 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, например.
__________________
Помогаю за Спасибо

Последний раз редактировалось v1s2222, 21.07.2012 в 00:23.
Ответить с цитированием
Этот пользователь сказал Спасибо v1s2222 за это полезное сообщение:
Flop88 (21.07.2012)
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:38.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter