Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

Kak uznat zapushenno li konkretnoe prilozhenie??   Найти похожие ветки 

 
NeedHelp   (2005-01-29 01:08) [0]

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 =))


 
Ihor Osov'yak ©   (2005-01-29 02:53) [1]

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

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


 
GrayFace ©   (2005-01-29 05:47) [2]

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


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

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

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.


 
Ihor Osov'yak ©   (2005-01-29 12:42) [4]

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 16:11) [5]

Ihor Osov"yak ©   (29.01.05 12:42)

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


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

Ogromnoe spasibo za otveti!!! =))



Страницы: 1 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.05 c
4-1103797611
digger
2004-12-23 13:26
2005.02.13
Горизонтальная прокрутка мышью


9-1099835093
Колбасьев
2004-11-07 16:44
2005.02.13
3DS и другие форматы


1-1107189233
xman
2005-01-31 19:33
2005.02.13
ListView


1-1106747451
mmms
2005-01-26 16:50
2005.02.13
Мастера, подскажите, как удалить строку из StringGrid


3-1105678872
БДешник
2005-01-14 08:01
2005.02.13
Работа с InterBase