![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не дать загрузить программу второй раз [D5, D6, D7, Win95/98, WinME, Win2k, WinXP]
Fil © (2003-05-26 18:03:00)А знает ли кто ,как не дать загрузить программу еще раз, если она уже запущена.
Заранее спасибо!
Polevi (2003-05-28 09:18:00) [1]y-soft © (27.05.03 22:10)
ok, ok , я вообщето шутил типа :))
y-soft (2003-05-27 22:10:00) [2]>Frankenstein (27.05.03 18:49)
>Polevi © (27.05.03 19:41)
У всех подобных компонентов единственное достоинство, что "их на форму можно кидать". Почему-то их авторы не учитывают тот факт, что с момента запуска процесса приложения до момента срабатывания кода компонента происходит гигантское по меркам процессора время, т.е. вполне возможен случай, что второй экземпляр приложения будет запущен как раз в этот промежуток и... спокойно запуститься! Второе (это как раз именно то, из-за чего обычно вся проверка и затевается), что до момента создания форм происходит множество инициализаций, которые могут вызвать серьезные конфликты между экземплярами приложения.
Из этого следует, что код проверки необходимо выполнять в программе как можно раньше. Поэтому в вышеуказанной статье я и предлагаю помещать этот код в секцию initialization первого загружаемого программой модуля.
Объекты ядра в качестве уникальных элементов для проверки намного предпочтительней всех других способов. Программа, например, может вообще не создавать окон, или же менять заголовок окна в процессе выполнения...
y-soft (2003-05-27 21:48:00) [3]>Soft © (27.05.03 17:24)
Приятно, что Soft © цитирует статью y-soft © :))
http://www.delphimaster.ru/articles/limit.html
Polevi (2003-05-27 19:41:00) [4]и на форму можно кидать
Frankenstein (2003-05-27 18:49:00) [5]Во многих библиотеках для Delphi для этой цели есть готовые компоненты, например ABC Pro, AHM Triton Tools. Компонент называется типа SingleInstance, с префиксом библиотеки - abc, ahm. Заодно и еще кума полезного (и бесполезного тоже)...
Soft (2003-05-27 17:24:00) [6]unit oneruned;
interface
implementation
uses
Windows;
var
Mutex : THandle;
MutexName : array[0..1024] of Char;
function StopLoading : boolean;
var
L,I : integer;
begin
// В качестве уникального имени мьютекса используем полный путь
// к исполняемому файлу приложения
L := GetModuleFileName(MainInstance,MutexName,SizeOf(MutexName));
// В имени мьютекса нельзя использовать обратные слэши, поэтому
// заменяем их на прямые
for I := 0 to L - 1 do
if MutexName[I] = "\" then
begin
MutexName[I] := "/";
end;
Mutex := CreateMutex(nil,false,MutexName);
Result := (Mutex = 0) or // Если мьютекс не удалось создать
(GetLastError = ERROR_ALREADY_EXISTS); // Если мьютекс уже существует
end;
initialization
if StopLoading then halt;
finalization
if Mutex <> 0 then
CloseHandle(Mutex);
end.
Ihor Osov'yak (2003-05-26 22:50:00) [7]2 Yanis © (26.05.03 22:01)
Не самый оптимальный вариант, есть много недостатков. Посему см.
MBo © (26.05.03 18:05) и по ссылке обращаем внимание на осуществление сабжа с помощью именнованых объетов ядра, например, мьютексов или семафоров..
Yanis (2003-05-26 22:01:00) [8]
Form1.OnCreate
begin
FindWindow(и ищи свою прогу);
end;
MBo (2003-05-26 18:05:00) [9]в FAQ