![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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, в некоторых толково, в некоторых - бестолково. Возмите за основание те решения, где используется именованные обьекты ядра.
второй - запускающее приложение анализирует список процессов, для каждого процесса получает путь к бинаоному файлу и сравнивает с тем, что собираемся запускать..
Второй способ при определенных обстоятельствах не выдерживает критики. Единственное преимущество (но оно может стать и недостатком) - что привязывается не к процессу как таковому, а к местоположению бинарного файла..