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

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

Опять про второй экземпляр приложения... [D6, Win95/98, Win2k, WinXP]


RDen ©   (2004-12-01 10:55:00) 

Здравствуйте! Не допускаю запуска второго экзэмпляра своего приложения так:
в .DPR
....
if FindWindow('TForm1','Данные по численности населения') <> 0 then
   begin
     SetForegroundWindow(FindWindow('TForm1','Данные по численности населения'));
     Application.Terminate;
     Exit;
   end;
....

но в ходе работы, меняется Caption у формы, и тогда запуск второго экзэмпляра становится возможным. Как этого избежать?
Спасибо.


RDen   (2004-12-01 12:33:00) [1]

Огромное спасибо, очень помогли!


Думкин   (2004-12-01 12:24:00) [2]

> [4] Alexander Panov ©   (01.12.04 11:36)

Мала - не мала. Тебе GUID-ов жалко? :)
Нажать Ctrl-Shift-G - гораздо проще и быстрее.


Alexander Panov   (2004-12-01 11:36:00) [3]

Думкин ©   (01.12.04 11:18) [3]
aUniqueString - GUID юзать. :(


Зачем?
Весьма мала вероятность того, например, что уникальную строку, если ее задать в виде UniqueStr := Application.Title+IntToStr(Application.FormMain.Handle),
какое-то приложение будет использовать.


Думкин   (2004-12-01 11:18:00) [4]

aUniqueString - GUID юзать. :(


TUser   (2004-12-01 11:01:00) [5]


> Как этого избежать?

Использовать мьютексы, например. Через FW тоже можно чего-нибудь придумать - например, при изменении Caption'а писать его в реестре где-нибудь. Тогда будешь искать окошко с правильным заголовком. Еще можно посоветовать изменить класс на TMainaUnikalnaGlavnaForma1 - это спасет.


Alexander Panov   (2004-12-01 11:00:00) [6]

Использовать мьютексы.
ответы есть в FAQ, полно в интернете.

Вот пример подобной функции:

function isRunning(aUniqueString:String): Boolean;
var
 hMutex: THandle;
begin
  Result := False;
  hMutex := CreateMutex(nil,False,PChar(aUniqueString));
  if GetLastError = ERROR_ALREADY_EXISTS then
  begin
    Result := True;
    CloseHandle(hMutex);
  end;
end;


Наверх

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