Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не дать загрузить программу второй раз [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо