Главная страница
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.032 c
4-1103887922
cfytr
2004-12-24 14:32
2005.02.13
имитация клика


4-1103891912
arick
2004-12-24 15:38
2005.02.13
Аттач к письму!!!


6-1101979272
zdx 200
2004-12-02 12:21
2005.02.13
Отсылка файла с IdHttpServer


1-1107093126
dms_main
2005-01-30 16:52
2005.02.13
Console Application


1-1107059167
ТехникПТО
2005-01-30 07:26
2005.02.13
Хранение данных