Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c