powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проверка наличия запущенного процесса.
12 сообщений из 12, страница 1 из 1
Проверка наличия запущенного процесса.
    #37050908
AndrewTR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую коллеги.

Есть простая система обновления версий. До недавнего времени всё работало нормально, но с появлением у клиентуры мегабыстрых компьютеров и мегаскорых сетей появилась проблемка. Для начала принцип работы системы (он, пожалуй, знаком многим).

1. Проверка наличия новой версии на FTP сервере.
2. Если есть новая версия, скачивается во временный файл.
3. Старая програмка запускает внешний адейтер и закрывается.
4. Апдейтер удаляет старую версию, переименовывает временный файл и запускает его.

Так вот, теперь время на скачивание стало настолько мало, что программа-инициатор не успевает закрыться. Хочу в апдейтере сделать проверку наличия запущеного процесса программы-инициатора.

Есть мысли использовать 2 варианта: используя CreateToolhelp32Snapshot и искать в списке инициатора по названию или передавая апдейтеру дескриптор инициатора в командной строке и проверять через GetProcess.

Первый мне кажется громоздким, второй некрасивым что ли. Не подскажете, есть вариант лучше чем эти два или лучший из этих двух.

Заранее спасибо!

AndrewTR
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса.
    #37050916
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обычно люди в таких случаях используют именованный мутекс.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса.
    #37051260
AndrewTR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
Я тут почитал... т.е. программа инициатор создаёт mutex с именем при запуске. Апдейтер не производит никаких действий, пока его, апдейдера попытка создать mutex с тем же именем возвращает ошибку. Я правильно понял работу именованых мьютексов?
Если так, то есть одна загвоздка. Апдейтер - универсальная программулька, один и тот же апдейтер (в смысле не процесс а exe файлик) идёт с остальными (около десятка) разными программками. Разница только в update.ini где указаны параметры соединения с ftp сервером.
Хотя как вариан наверное можно в этот ini файл записать имя мьютекса.
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса.
    #37051290
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewTRХотя как вариан наверное можно в этот ini файл записать имя мьютекса.

А зачем? Можно использовать само имя программы. ЕМНИП пространство имён имеет иерархию,
так что ты спокойно можешь дать мутексу имя "MyUpdater\MyProject1.exe".
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса.
    #37052440
Lexx.sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а если:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 function  FindTask(ExeFileName:  string ): integer;
  var 
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  begin 
  result :=  0 ;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,  0 );
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
   while  integer(ContinueLoop) <>  0   do 
    begin 
     if  ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName))
      or  (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName)))
       then  Result :=  1 ;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
    end ;
  CloseHandle(FSnapshotHandle);
  end ;


затем просто:

Код: plaintext
1.
2.
3.
 
  if  findtask('myproj.exe')=  1   then   //процесс ещё запущен... 



не так уж много кода....

да и запущенный exe всегда можно переименовать, а затем только закрыть, и удалять не обязательно.
Если не критичен одновременный запуск приложения - это может быть выход...
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса.
    #37052630
Фотография demian111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewTR,

А мне почемуто кажется что как то так правильней будет:

Инициатор:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 procedure  TFormMain1.Button1Click(Sender: TObject);
 var 
  StartupInfo: TStartupInfo;
  ProcessInformation: TProcessInformation;
  S:  String ;
 begin 
  ZeroMemory(@StartupInfo,SizeOf(TStartupInfo));
  StartupInfo.cb:=SizeOf(TStartupInfo);
  S:='Project2.exe '+IntToStr(GetCurrentProcessId);
   if   not  CreateProcess( nil ,PChar(S), nil , nil ,False, 0 , nil , nil ,StartupInfo,ProcessInformation)  then  RaiseLastOSError;
  Sleep( 5000 );
  Application.Terminate;
 end ;

Апдейтер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 procedure  TFormMain2.FormCreate(Sender: TObject);
 var 
  ProcessId: Cardinal;
  hProcess: THandle;
 begin 
   if  ParamCount< 1   then   raise  Exception.Create('Ahtung...');
  ProcessId:=StrToInt(ParamStr( 1 ));
  hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
  WaitForSingleObject(hProcess,INFINITE);
 end ;
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса.
    #37053216
AndrewTR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё решилось, спасибо за идею с мьютексами! В качестве имени использовалась контрольная сумма - весчь откровенно уникальная :)
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса.
    #37053227
AndrewTR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
demian111AndrewTR,

А мне почемуто кажется что как то так правильней будет:


Апдейтер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 procedure  TFormMain2.FormCreate(Sender: TObject);
 var 
  ProcessId: Cardinal;
  hProcess: THandle;
 begin 
   if  ParamCount< 1   then   raise  Exception.Create('Ahtung...');
  ProcessId:=StrToInt(ParamStr( 1 ));
  hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
  WaitForSingleObject(hProcess,INFINITE);
 end ;


Вот этот механизм почему и перестал работать на машинах с ОС WinVista и Win7. А вот с мьютексами - всё ОК.
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса.
    #37053232
Фотография demian111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewTRВот этот механизм почему и перестал работать на машинах с ОС WinVista и Win7

Врешь
Проверено на win7, работает.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Проверка наличия запущенного процесса.
    #39491238
Gluu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как узнать полный путь к EXE, а не тока имя как здесь?
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса.
    #39491240
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
GluuА как узнать полный путь к EXE, а не тока имя как здесь?
а надо делать не так, как в древнем посте.

запускается всегда программа-апдейтер. Юзеру пофигу, что там за ссылкой скрывается.

Проверяет обновления, скачивает новые файлы, запускат уже реальную программу.

Профит
...
Рейтинг: 0 / 0
Проверка наличия запущенного процесса.
    #39491605
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorПрофит1. Берем хэндл процесса
2. Делаем его наследуемым
3. Запускаем апдтейтер и передаем ему этот хэндл как параметр
4. В апдейтере дергаем WaitForSingleObject
5. Профит
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проверка наличия запущенного процесса.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]