Советы по Delphi. Версия 1.4.3 от 1.1.2001 - [8]

Шрифт
Интервал

MI_FAIL_SUBCLASS;

>end;


>procedure DoFirstInstance;

>begin

> SubClassApplication;

> MutHandle := CreateMutex(Nil, False, UniqueAppStr);

if MutHandle = 0 then MIError := MIError or MI_FAIL_CREATE_MUTEX;

>end;


>procedure BroadcastFocusMessage;

>begin

> Application.ShowMainForm := False;

> PostMessage(HWND_BROADCAST, MessageId, 0, 0);

>end;


>function InitInstance : Boolean;

>begin

> MutHandle := OpenMutex(MUTEX_ALL_ACCESS, False, UniqueAppStr);

if MutHandle = 0 then begin

>ShowWindow(Application.Handle, SW_ShowNormal);

>  Application.ShowMainForm:=True;

>  DoFirstInstance;

>  result := True;

end

> else begin

>  RegWork.RWSetParamStr1;

>  BroadcastFocusMessage;

>  result := False;

end;

>end;


>initialization

>begin

> UniqueAppStr := PChar(Application.ExeName);

> MessageID := RegisterWindowMessage(UniqueAppStr);

> ShowWindow(Application.Handle, SW_Hide);

> Application.ShowMainForm:=FALSE;

>end;


>finalization

>begin

> if WProc <> Nil then SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(WProc));

>end;


>end.

Как не допустить запуск второй копии программы IX

YoungHacker рекомендует следующий код:

Был взят из кулибы и доработан, поскольку возникали ситуации когда программа, по HotKey назначенным на ярлык, запускалась дважды и более раз. Связано с тем что поиск мутекса и его создание разнесены во времени и пока в одном приложении мутекс не нашелся но еще не создался второе приложение тоже не находит мутекса и инициирует его создание

Поиск окон и создание их нарываются на те-же проблемы. Из RxLib Функция тоже не обходит этой ситуации.

Мой вариант немного дорабатывает уже значительно переработанное то что предоставили разработчики Delphi 2 Пачека (Pacheco) и Тайхайра (Teixeira). и находится в файле TPrevInstUnit. В файле проекта пишется следующий вызов:

>begin

> //– Найти предыдущую версию программы

> if (initinstance) then begin

>  …

>  Application.Initialize;

>  …

>  Application.CreateForm();

>  …

>  Application.Run;

> end;

>end.

Файл TPrevInstUnit

>unit TPrevInstUnit;


>interface


>uses Forms, Windows, Dialogs, SysUtils;


>function InitInstance : Boolean;


>implementation


>const

> UniqueAppStr : PChar = #0; // Различное для каждого приложения

>                            // Но одинаковое для каждой копии программы

>var

> MessageId : Integer;

> OldWProc : TFNWndProc = Nil;

> MutHandle : THandle = 0;

> SecondExecution : Boolean = False;


>function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint): Longint; StdCall;

>begin

> //- Если это - сообщение о регистрации... }

if (Msg = MessageID) then begin

>//- если основная форма минимизирована

>  if IsIconic(Application.Handle) then begin

>//- восстанавливаем

>   ееApplication.Restore;

>  end

>  else begin

>//- вытаскиваем на перед

>   ShowWindow(Application.Handle, SW_SHOW);

>   SetForegroundWindow(Application.Handle);

>   Application.BringToFront;

end;

>  Result := 0;

end

> else

>{ В противном случае посылаем сообщение предыдущему окну }

>  Result := CallWindowProc(OldWProc, Handle, Msg, wParam, lParam);

>end;


>function InitInstance : Boolean;

>var

> BSMRecipients: DWORD;

>begin

> Result := False;

> //- пробуем открыть MUTEX созданный предыдущей копией программы

> MutHandle := CreateMutex(Nil, True, UniqueAppStr);

> //- Мутекс уже был создан ?

> SecondExecution := (GetLastError = ERROR_ALREADY_EXISTS);

> if (MutHandle = 0) then begin

>ShowMessage('Ошибка создания Mutex.');

>  Exit;

end;

> if Not (SecondExecution) then begin

>//- назначаем новый обработчик сообщений приложения, а старый сохраняем

>  OldWProc := TFNWndProc(SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc)));

>  //- если обработчик не найден устанавливаем ошибку

if (OldWProc = Nil) then begin

>ShowMessage('Ошибка поиска стандартного обработчика сообщений приложения.');

>   Exit;

end;

>  //- Установить "нормальный" статус основного окна приложения

>  ShowWindow(Application.Handle, SW_ShowNormal);

>  //- покажем основную форму приложения

>  Application.ShowMainForm := True;

>  //- все нормально мама трын тин тин тин тири тын тын

>  Result := True;

end

> else begin

>//- установить статус окна приложения "невидимый"

>  ShowWindow(Application.Handle, SW_Hide);

>  //- Не покажем основную форму приложения

>  Application.ShowMainForm := False;

>  //- Посылаем другому приложению сообщение и информируем о необходимости

>  // перевести фокус на себя

>  BSMRecipients := BSM_APPLICATIONS;

>  BroadCastSystemMessage(BSF_IGNORECURRENTTASK or BSF_POSTMESSAGE, @BSMRecipients, MessageID, 0, 0);

> end;

>end;


>initialization

>begin

> //- Создать ункальную строку для опознания приложения

> UniqueAppStr := PChar('YoungHackerNetworkDataBaseProgramm');

> //- Зарегистрировать в системе уникальное сообщение

> MessageID := RegisterWindowMessage(UniqueAppStr);

>end;


>finalization

>begin

> if (OldWProc <> Nil) then

>{ Приводим приложение в исходное состояние }

>  SetWindowLong(Application.Handle, GWL_WNDPROC, LongInt(OldWProc));

> end;


>end.

Как не допустить запуск второй копии программы X

Nomadic рекомендует следующий код:

FindWindow является неполным решением (если меняется заголовок окна или если есть другая программа с таким же заголовком или типом окна).

Вторично: Это работает медленно.

Правильно — использовать обьекты синхронизации Win32 API.

Лениво пользовать семафоры, покажу на именованных мутексах (семафоры с двумя состояниями).


Еще от автора Валентин Озеров
Советы по Delphi. Версия 1.0.6

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.