Comments 8
Ну и каким таким образом скрытие консольного окна через HideConsole поможет вам избавиться от мерцания этого самого окна?
Почему для обнаружения уже запущенного экземпляра вы используете мьютекс, а для связи с ним - именованный канал? Что помешало использовать канал для обоих задач?
Почему ReadParamsFromPipe ожидает подключения клиента только 1 раз? Почему вы делаете в цикле CreateNamedPipe, а не ConnectNamedPipe?
Ну потому что программируют как умеют...
Интересно, а мьютекс освободится/разрушится если первый экземпляр программы упадет или будет убит извне?
Разумеется, все объекты ядра система "прибирает". Иначе бы любой "прибитый" процесс оставлял после себя тонны мусора.
В этом основное отличие именованных объектов ядра от допустим файлов. Как только релизится все экземпляры или завершаются процессы, создавший или открывший определенный объект, диспетчер объектов прибивает данный объект. Собственно сам по себе мютекс вообще не при делах. Эффект заключается просто в создании любого именованного объекта, просто при повторном создании система скажет, что объект с таким именем уже создан. Собственно хватило бы проверки создания самого именованного канала '\\.\pipe\ask_protocol_reader_pipe'
, создание мутанта в данном приложении совершенно лишнее, как указали выше
Аж олдскулы свело. Код для Delphi из далёкого 2008.
function AlreadyWorks(Str: PWideChar): Boolean;
var
Hdle: THandle;
begin
(* Проверяет наличие уже запущенного указанного экземпляра приложения *)
//Открытие Мьютекса (виртуального файла)
Hdle:=OpenMutex(MUTEX_ALL_ACCESS, False, Str);
//... в памяти
Result:=(Hdle<>0);
//Если ещё не был создан, то создаём
If Hdle=0 then CreateMutex(nil, False, Str);
end;
// И использование
program App;
uses
Forms,
Main in 'Main.pas' {fMain};
{$R *.res}
begin
If AlreadyWorks('MyApp') then
Begin
// Тут показываем сообщение, что приложение уже запущено
Exit;
End;
...
Application.Run;
end.
Всем спасибо за замечания. Сделал дополнение к статье, постарался все учесть.
Обработка повторных запусков приложения в Windows