Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];

Вниз

Мьютексы   Найти похожие ветки 

 
zlo   (2010-07-28 15:49) [0]

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

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?


 
12 ©   (2010-07-28 16:03) [1]


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

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


 
12 ©   (2010-07-28 16:05) [2]


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

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


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


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


OK. Тут ясно.


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


т.е.?


 
Anatoly Podgoretsky ©   (2010-07-28 16:57) [4]

> 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 17:18) [5]

переписал. Для проверки заюзал функцию 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;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.10.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.003 c
15-1279545359
Свифт
2010-07-19 17:15
2010.10.24
Англоязычные радиостанции


2-1280146994
nordford
2010-07-26 16:23
2010.10.24
Обход препятсвия


2-1280382192
mm0
2010-07-29 09:43
2010.10.24
Выпадающий список как в google в строке поиска


3-1247050667
Mamed1971
2009-07-08 14:57
2010.10.24
SQL server Replication


15-1279190064
Novik
2010-07-15 14:34
2010.10.24
Современное телевидение





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский