![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Блокировка повторного запуска приложения
NY152 © (2002-01-29 14:03:00)Люди добрые, подскажите как проверить наличие копии программы в памяти чтобы исключить её повторный запуск ? В инете есть куски кода - но все они какие-то очень сложные, может кто пользуется чем-то уже давно, дайте процедурку =)
Заранее благодарен.
ПС: заранее прошу прощения, наверное уже были подобные вопросы, но я что-то не нашёл их, подскажите тогда ссылку =)
Koudrinski (2002-03-13 19:25:00) [1]Mutex"ы вещь хорошая, только под WinXP, если нужно блокировать любой повторный запуск приложения при сделанном Switch User, они не работают (сам проверял в связи с этой проблемой). В каждои сеансе Mutex"ы независимы.
Пока я остановился на варианте открыти определённого файла c доступом для записи. Соответственно, другое приложение этого сделать не может. Хотя, это, конечно, не решение. Но в моём случае этого хватает.
VuDZ (2002-02-08 13:08:00) [2]но на мой взгляд, этот метод даёт 100% гарантию того, что не будет запущен второй экземпляр приложения.
Johnmen (2002-02-08 11:20:00) [3]>VuDZ © : С apache пример неудачный, т.к. он изначально не заточен под win платформу...
VuDZ (2002-02-07 23:22:00) [4]why?
я использовал пару раз такой метод - и всё работало отлично. и обойти эту защиту никак нельзя... если правильно сделать
Raptor (2002-02-07 22:43:00) [5]2 VuDZ
Этот метод годится только для того, что бы, как ты сказал, можно отследить, успешно завершился софт или нет.
А для того, что бы не допустить запуска двух екземпляров одного приложения не совсем подходит. У него те же недостатки, что и у способа с использованием FindWindow.
ASgroup (2002-02-07 17:51:00) [6]qwqwq
ASGroup (2002-02-07 17:49:00) [7]Есть такая АПИ
VuDZ (2002-02-07 13:35:00) [8]незнаю зачем, но часть софта, которым я пользуюсь и который написан профессионалами так и делает - apache для примера. Это даёт 100% гарантию и можно отследить, успешно завершился софт или нет...
ЗЫ где тут сложности, я не вижу... дел - на 2 мин...
Johnmen (2002-02-07 13:33:00) [9]>VuDZ © : К чему такие корявые сложности, если в Win есть спец.механизмы для решения проблемы (см.выше) ?
VuDZ (2002-02-07 12:37:00) [10]кхм...
а как такое:
в каталоге конфигурации программы или в temp"e создаём файл типа mycoolsoft.log в котором будет прописан pid первого экземпляра программы
при запуске проверяем наличие такого файла, если есть - ищем такой процесс. если его нет, то программу вырубили экстренно, очищаем файл, иначе передаём фокус на первый экземпляр приложения...
и делов-то, и работает со 100% гарантией, если есть голова
Керик (2002-02-07 05:00:00) [11]Я делаю так:
var
UniqueMapping: THandle;
...
UniqueMapping := CreateFileMapping($ffffffff, nil, PAGE_READONLY, 0, 32, "Имя программы");
if UniqueMapping = 0 then
begin
Application.MessageBox("Ошибка выделения памяти!",
"Ошибка", mb_IconError+mb_Ok);
Halt;
end
else ifGetLastError = ERROR_ALREADY_EXISTS then
begin
Application.MessageBox("Вы запускаете програму второй раз! Работать не буду :-)", "Ошибка!", mb_IconInformation+mb_Ok);
Halt;
end;
Меня эта штука ещё не поводила! Этот кусок кода нужно класть в самый dpr - файл перед операторомApplication.Initialize
Johnmen (2002-02-06 15:22:00) [12]>Fellomena : я не совсем понял, что конкретно ты хотел сказать
(Fellomena (05.02.02 13:44)), но высказывания в (Fellomena (06.02.02 15:05)) в целом верны :)
Fellomena (2002-02-06 15:05:00) [13]2 Johnmen:
Как это чего ? 8)
В нашем конкретном случае ПРОЦЕССА, но можно таким образом и thread-ы синхронизировать в процессе - разницы не много.
Ведь создаваемый семафор или мьютекс, как я понимаю, объект глобальный, т.е., наверное, рассполагается не в АП процесса из которого он был установлен, а в куче самого Win, хотя он (семафор или мьютекс)
связан с породившим процессом, т.е. при завершении работы процесса мьютекс уничтожается 8)
Наверное так...
Johnmen (2002-02-05 15:03:00) [14]>>>Fellomena : ...только кол-во экземпляров всегда равно 1 ...
экземпляров чего ?
Fellomena (2002-02-05 13:44:00) [15]2 Johnmen © (29.01.02 16:24)
>>>panov © ты неправ, система семафоров однозначно определяет, запущен ли процесс...
Хех... а семафор от мьютекса отличается лишь тем, что семафорами можно варьировать кол-во запущенных экземпляров, тогда как мьютекс это тот же семафор, только кол-во экземпляров всегда равно 1 - вот.
copyr25 (2002-01-30 20:47:00) [16]Т.е. "Manaenkov Paul" <paulmank@hotmail.com>
это автор кода, который любезно предложил мне его на мой
призыв о помощи...
copyr25 (2002-01-30 20:40:00) [17]Однажды я делал ScreenSaver и, понятное дело, натолкнулся на то же.
Вот код, который безупречно работает:
...
var
myAtom:Atom;
...
procedure TForm1.FormCreate(Sender: TObject);
var ia:ATOM;
begin
ia:=GlobalFindAtom("MyOwnAtom");
if (ia<>0) then halt(0);
myAtom:=GlobalAddAtom("MyOwnAtom");
end;
...
procedure TForm1.FormDestroy(Sender: TObject);
begin
GlobalDeleteAtom(myAtom);
end;
"Manaenkov Paul" <paulmank@hotmail.com>
Юрий Зотов (2002-01-30 15:05:00) [18]> В это время успешно может стартовать та же самая программа.
Стартовать-то она может, ну и что? Пусть себе стартует.
Но затем она попытается создать объект ядра, а в ответ получит ERROR_ALREADY_EXISTS и завершится, ничего не сделав. Что и требовалось.
panov (2002-01-30 09:57:00) [19]Признаю ошибку.
Согласен.:-)
Алексей Петров (2002-01-30 08:02:00) [20]> panov © (30.01.02 07:01)
> Никакой гарантии.
Ты не прав. CreateSemaphore и ей подобные выполняются ядром последовательно и выставляют GetLastError в 0, если объект действительно создан или в ERROR_ALREADY_EXISTS, если объект был создан ранее а сейчас только открыт.
При этом 2 процесса не могут получить GetLastError=0 при создании объекта с одним именем.