Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Kak uznat' zapushenno li konkretnoe prilozhenie?? [D7, WinXP]


NeedHelp ©   (2005-01-29 01:08:00) 

Mastera, takoj vopras, kak s pomosh'ju programki opredelit', rabotaet to est' -->zapushen' li Reminder.exe.
Ja ispol'zuju takoj kod 4tob zapustit' programku
 path:=ExtractFileDir(application.exename);
 winexec(pchar(path+'\Reminder.exe'), 0);
no esli reminder.exe uzhe zapushen, to on zapuskaet ego e6eraz =((( a kak etogo izbezhat'??
Pomogite pozhalujsta =))
Zaranee blagodarna =))


GotHelp   (2005-01-29 16:26:00) [1]

Ogromnoe spasibo za otveti!!! =))


PZ   (2005-01-29 16:11:00) [2]

Ihor Osov'yak ©   (29.01.05 12:42)

А чем этот способ плох? Не понимаю. Я делаю так, работает надежно, всегда определяет запущенный экземпляр программы. Сбоев не бывает. В чем же недостаток?


Ihor Osov'yak   (2005-01-29 12:42:00) [3]

2 [3] PZ   (29.01.05 07:58)

не в обиду - предложеный Вами способ - один из худших, который можно реализовать..
зы - я не зря упомянул именованные обьекты ядра.

Я делаю примерно так:

program RegCleaner;

uses
 windows,
 ...


var
 hSemaphore: THandle;

begin
 hSemaphore := CreateSemaphore(nil, 0, 1, '6DB73144-3018-44B9-AE43-9D220778DB91');
 { строку вида '6DB73144-3018-44B9-AE43-9D220778DB91' генерируем для каждого проекта индивидуально посредством нажания CtrlShiftG в IDE D и последуещей незначительной правки результата нажатия :-)}
  try

   if GetLastError = ERROR_ALREADY_EXISTS then
   begin
     // здесь код, переводящий на передний план уже запущенный экземпляр -      // но это уже отдельный разговор
     Exit;
   end;

   Application.Initialize;
   Application.CreateForm(....);
   Application.Run;

 finally
   ReleaseSemaphore(hSemaphore, 0, nil);
 end;

end.


PZ   (2005-01-29 07:58:00) [4]

По первому варианту можно делать так:

program LoadInet;

uses
 Forms,
 Dialogs,
 Windows,
 LoadInetUn in 'LoadInetUn.pas' {LoadInetFrm};

{$R *.res}

begin
 // Не допустить запуск программы второй раз
 HPrevInst := FindWindow('TLoadInetFrm', Nil);
 If HPrevInst = 0 then
   begin
     Application.Initialize;
     Application.CreateForm(TLoadInetFrm, LoadInetFrm);
     Application.Run;
   end
 else
   begin
     ShowMessage('LoadInet уже запущен');
     Windows.SetFocus(HPrevInst);
     Windows.SetForeGroundWindow(HPrevInst);
   end;
end.


GrayFace   (2005-01-29 05:47:00) [5]

3-й способ - самый простой, но самый не выдерживающий критики - искать окно.


Ihor Osov'yak   (2005-01-29 02:53:00) [6]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо