Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2013, 02:38   #1
megostudent
Форумчанин
 
Регистрация: 31.12.2010
Сообщений: 320
По умолчанию поиск процесса

Код:
uses
tlhelp32;
//поиск процесса
function processExists(exeFileName: string): Boolean;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
Result := False;
while Integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
begin
Result := True;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

procedure TForm1.Timer4Timer(Sender: TObject);
begin
if processExists('game.exe') then
showmessage('Доигрался =)');
end;
но беда в том что процесс находится четко на 32 битной системе, а на 64 сразу ошибку выбивает, как сделать и для 64битки?
megostudent вне форума Ответить с цитированием
Старый 04.01.2013, 06:49   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Может типа этого
Код:
{$ifdef cpu32}
uses
  tlhelp32;

function processExists(exeFileName: string): Boolean;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  Result := False;
  while Integer(ContinueLoop) <> 0 do begin
    if (UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or
                               (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName)) then begin
      Result := True;
      Break;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;
{$endif}

{$ifdef cpu64} // ДАЛЕЕ ВЕСЬМА УСЛОВНО
uses
  tlhelp64;

function processExists(exeFileName: string): Boolean;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry64: TProcessEntry64;
begin
  FSnapshotHandle := CreateToolhelp64Snapshot(TH64CS_SNAPPROCESS, 0);
  FProcessEntry64.dwSize := SizeOf(FProcessEntry64);
  ContinueLoop := Process64First(FSnapshotHandle, FProcessEntry64);
  Result := False;
  while Integer(ContinueLoop) <> 0 do begin
    if (UpperCase(ExtractFileName(FProcessEntry64.szExeFile)) = UpperCase(ExeFileName)) or
                               (UpperCase(FProcessEntry64.szExeFile) = UpperCase(ExeFileName)) then begin
      Result := True;
      Break;
    end;
    ContinueLoop := Process64Next(FSnapshotHandle, FProcessEntry64);
  end;
  CloseHandle(FSnapshotHandle);
end;
{$endif}
Если нужно в runtime, то нужно сначало определить разрядность системы далее вызвать соответствующую функцию.
Sibedir вне форума Ответить с цитированием
Старый 05.01.2013, 02:48   #3
megostudent
Форумчанин
 
Регистрация: 31.12.2010
Сообщений: 320
По умолчанию

тоже думал поменять с 32 на 64 в коде) но не придал этому значения, решил что все серьезнее) попробую когда высплюсь)
megostudent вне форума Ответить с цитированием
Старый 06.01.2013, 20:49   #4
megostudent
Форумчанин
 
Регистрация: 31.12.2010
Сообщений: 320
По умолчанию

Код:
tlhelp64;
не понимает этого делфи(
megostudent вне форума Ответить с цитированием
Старый 06.01.2013, 22:00   #5
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от Sibedir
Код:
{$ifdef cpu64} // ДАЛЕЕ ВЕСЬМА УСЛОВНО
uses
  tlhelp64;
Это всё как бы. Число '32' в имени процедур указывает на разрядность системы в которой она работает. Для другой разрядности должна быть и соответствующая процедура. Если ее нет, то либо нужно поискать аналог, либо посмотреть код процедуры32 и исправить его содержимое под 64, либо искать иной способ.
Sibedir вне форума Ответить с цитированием
Старый 07.01.2013, 21:08   #6
megostudent
Форумчанин
 
Регистрация: 31.12.2010
Сообщений: 320
По умолчанию

Решение проблемы по поиску процеса в 64бит системе не нашел. Нашел только способ запуска 32битной программы на 64бит системе, это создание ярлыка проги и запуск ее батником
Код:
@echo off 
start %windir%\explorer.exe d:\program.lnk 
exit
, но думаю это не поможет. Пришла мысль в голову поиска активного окна и определение его названия, и если название name_game , то делаем свое действие. Как думаете это будет реально на 64 или дальше искать способы чека процесса?
megostudent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в памяти процесса Mr_ViK Общие вопросы Delphi 5 27.08.2012 21:38
Поиск процесса и условие ashkalov Win Api 2 30.07.2012 14:52
Поиск сигнатуры в памяти процесса Crystallon Общие вопросы Delphi 8 26.09.2011 23:01
Запуск процесса в потоке, завершение процесса в указааноое время, Дайте совет Человек_Борща Общие вопросы Delphi 3 29.08.2010 12:58
Delphi, поиск процесса north Помощь студентам 1 20.03.2008 22:06