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

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

Мьютексы


zlo ©   (2010-07-28 15:49:00) 

для консольного приложения нужно запретить возможность повторного запуска. Сделал так:

program Updater;

{$APPTYPE CONSOLE}

uses
 Windows, SysUtils;
var
 Mutex: THandle;
begin
 Mutex := CreateMutex(nil, False, PChar(ExtractFileName(ParamStr(0))));
 try
   if GetLastError <> ERROR_ALREADY_EXISTS then
   begin
     // ...
   end;
 finally
   CloseHandle(Mutex);
 end;
end.

Нашел пример в котором указатель на имя mutex-object задан как: 'E191BA0C41924AA9840243D5CAE346AF'.
- Будет ли более правильным такой подход?
- Нужно ли делать CloseHandle, если функция CreateMutex возвращает 0. Может правильнее try..finally блок перенести в if?


zlo   (2010-07-28 17:18:00) [1]

переписал. Для проверки заюзал функцию WaitForSingleObject. теперь правильно?


var
 Mutex: THandle;
begin
 Mutex := CreateMutex(nil, False, '{0AA1E4BE-7610-4195-A969-257D6E2F24A5}');
 if WaitForSingleObject(Mutex, 0) = 0 then
 begin
   try
     Readln;
   finally
     CloseHandle(Mutex);
   end;
 end;


Anatoly Podgoretsky   (2010-07-28 16:57:00) [2]

> zlo  (28.07.2010 15:49:00)  [0]

Какая тебе разница какое имя у мьютекса, я обычно использую GUID
Не нужно, мьютекс не создан.
У тебя явная ошибка с    if GetLastError <> ERROR_ALREADY_EXISTS then
Если функция вернет 0, то ты будешь работать с несозданым мьютексом, чего
естественно делать не надо, да и вызывать GetLastError до проверки на
создание мьютекса как бы тоже неправильно

if Mutex <> false  // я не помню объявления функции исхожу из того, что BOOL
иначе проверяй значения по списку или на = ERROR_ALREADY_EXISTS
 вот здесь и проверяй
else
 обработай ошибку

У тебя же будет пытать и при ERROR_INVALID_HANDLE и других ошибках


zlo   (2010-07-28 16:07:00) [3]


> менее уникально, чем, например, GUID


OK. Тут ясно.


> а зачем его помнить?


т.е.?


12   (2010-07-28 16:05:00) [4]


> - Нужно ли делать CloseHandle, если функция CreateMutex
> возвращает 0. Может правильнее try..finally блок перенести
> в if?

а зачем его помнить?


12   (2010-07-28 16:03:00) [5]


> PChar(ExtractFileName(ParamStr(0))));

менее уникально, чем, например, GUID


Наверх

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