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

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

Повторный запуск [D7, Win2k]


Gia Gvatua ©   (2004-03-02 12:02:00) 

Хочу избежать одновременного запуска двух копий одного приложения. Написал функцию:

function  ActivatedOld(H: hWnd): Boolean;
var
 Pch: array [0..256] of char;
begin
 repeat
   H:= GetNextWindow(H, GW_HWNDPREV);
   GetWindowText(H, Pch, 254);
 until (H = 0) or (Pch = 'MyForm');
 if H = 0 then Result:= False;
 if Pch = 'MyForm' then Result:= True;
end;

которую вызиваю из проектного файла перед созданием всех форм так:

...
...
begin
 Application.Initialize;
 if ActivatedOld(FindWindow('TfrmMain, 'MyForm')) then Exit;
 Application.CreateForm(TfrmMain, frmMain);
 Application.CreateForm(...
...
...

Запускается много копий приложения, т.е. функция всегда возвращает false.

Помогите пожалуйста


Alexander666   (2004-03-04 04:39:00) [1]

Атомы может и в других областях хороши, но по данному сабжу ответ уже сказан, надо использовать мьютексы (я и сам их использую), дана ссылка и все. Тем более там ВСЕ ПРОСТО!


y-soft   (2004-03-03 20:57:00) [2]

>DillerXX ©   (03.03.04 20:31) [11]

Без явного удаления (GlobalFreeAtom) атом не удаляется до перезагрузки ОС.
Если Ваша программа будет завершена через TerminateProcess или еще как-нибудь аварийно завершится, то атом не будет удален со всеми вытекающими последствиями


DillerXX   (2004-03-03 20:31:00) [3]

А чем тогда атомы плохи?


AlexeyITN   (2004-03-03 17:56:00) [4]

Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN
 IF (Wnd <> Application.Handle) AND (GetWindow(Wnd, gw_Owner)=0)
THEN
  BEGIN
  GetWindowText (Wnd, buff, sizeof (buff ));
  IF StrPas (buff) = Application.Title THEN
  BEGIN
     FlashWindow(Wnd,true);
     SetForegroundWindow(Wnd);
     Halt;
  END;
--------------------------------------
а может человеку нужен простенький работающий код, а не написание Windows2008SE :)
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;                                }


y-soft   (2004-03-03 17:47:00) [5]

>Brenagwynn ©   (02.03.04 13:57) [7]

Надоело уже объяснять, почему использование Global Atom плохая идея. Тоже самое о FindWindow. В ссылке [6] все объяснено и есть работающие примеры


Soft   (2004-03-03 04:00:00) [6]

>>[lamer]Barmaglot ©   (02.03.04 13:18) [6]

Вот это работает отлично, сам использую...


Brenagwynn   (2004-03-02 13:57:00) [7]

А можно и проще. При первом запуске проверить на наличие некоего глобального атома MY_SUPER_PROGRAM_BLAH_BLAH_BLAH (придумать достаточно уникальное имя :). Если такого атома нет, то добавить, а если есть, то тихо выйти.


[lamer]Barmaglot   (2004-03-02 13:18:00) [8]

RTFM?

http://www.delphimaster.ru/articles/limit.html


Reindeer Moss Eater   (2004-03-02 12:17:00) [9]

Если на первой итерации цикла GetWindowText заполнить буфер текстом "Вася Пупкин",
А на второй итерации текстом "Петя"

То в буфере окажется "Петя Пупкин"


Reindeer Moss Eater   (2004-03-02 12:14:00) [10]

Если вызов FindWindow('TfrmMain, 'MyForm') находит MyForm,
то какой смысл в цикле repeat искать NextWindow и сравнивать GetWindowText опять с 'MyForm'?

Я уже не говорю о безобразной работе с буфером PCh в твоем цикле


LGL   (2004-03-02 12:13:00) [11]

CLimitSingleInstance g_SingleInstanceObj(TEXT("{2194ABA1-BFFA-4e6b-8C26-D191BB16F9E6}"));

TMainForm *MainForm;
__fastcall TMainForm::TMainForm(TComponent* Owner)
       : TForm(Owner)
{
       if (g_SingleInstanceObj.IsAnotherInstanceRunning())
       {
               MessageDlg("Приложение уже запущено", mtInformation, TMsgDlgButtons() << mbOK, 0);
               Application->Terminate();
       }
}


Reindeer Moss Eater   (2004-03-02 12:07:00) [12]

Запускается много копий приложения, т.е. функция всегда возвращает false.

Помогите пожалуйста


GetLastError поможет.


Kerk   (2004-03-02 12:04:00) [13]

Создавай лучше мьютекс и проверяй при старте его наличие


Наверх

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