IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> Отслеживание двойного запуска
Unconnected
сообщение 25.06.2011 4:12
Сообщение #1


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Нужно встроить в программу проверку, не запущена ли уже эта её копия. В гугле это есть, но.. осложняется тем, что теоретический дабл-запуск будет как бы фор-кликом, то есть мгновенно после первого запуска. И видимой формы тоже нет..


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
IUnknown
сообщение 26.06.2011 1:17
Сообщение #2


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

Репутация: -  627  +


Кстати, тут у тебя еще есть неприятные мелочи, которые могут сильно осложнить тебе жизнь:

1)
  f_m := CreateMutex(nil, true, srMutexName);
if ( (ERROR_ALREADY_EXISTS = GetLastError()) or (ERROR_ACCESS_DENIED = GetLastError()) ) then begin
Я бы поменял проверки местами: то есть, сначала убедись, что CreateMutex вернула не NULL, и только потом проверяй, а что за ошибка? Если ERROR_ALREADY_EXISTS (ну, и ERROR_ACCESS_DENIED тоже можешь сюда включить) - то все нормально, мьютекс просто уже существует... Кстати, зачем ты его при этом удаляешь - не понятно. Если он есть - то удалить его может только владелец, кто ж тебе даст другому приложению удалить объект ядра? Проблемы что-ли нужны? 64-битные ОСи таких ошибок не прощают smile.gif Это тебе не старая добрая WinXP 32 bit...

2) даже если и даст - мьютекс не удаляется через CloseHandle... Специально была придумана ReleaseMutex... То есть, во втором чтении код принимает вид:

uses
Windows, SysUtils;
const
srMutexName = 'VOLVO_APP_VERY_LONG_ID_STRING'; // Тут на самом деле была еще пара десятков цифр
var
f_m: THandle; // mutex
begin
f_m := CreateMutex(nil, true, srMutexName);

if (f_m <> 0) then
begin
if (GetLastError() = ERROR_ALREADY_EXISTS) or (GetLastError() = ERROR_ACCESS_DENIED) then
begin
MessageBox(0, 'Another instance is already running', 'Error', MB_OK);
end
else
try
MessageBox(0, 'test', 'test', MB_OK);
//Application.Initialize;
// ...
//Application.Run;
finally
ReleaseMutex(f_m);
end;
end
else
MessageBox(0, 'CreateMutex = NULL', 'Error', MB_OK); // А вот это уже странно...
end.

(не надо этих Сишных заморочек с константой слева/именем функции справа. Это в случае Дельфи бесполезно)

Сообщение отредактировано: IUnknown - 26.06.2011 1:18
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 31.07.2025 2:01
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"