Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

Повторный запуск   Найти похожие ветки 

 
Gia Gvatua   (2004-03-02 12:02) [0]

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

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.

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


 
Kerk ©   (2004-03-02 12:04) [1]

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


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

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

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


GetLastError поможет.


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

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:14) [4]

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

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


 
Reindeer Moss Eater ©   (2004-03-02 12:17) [5]

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

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


 
[lamer]Barmaglot ©   (2004-03-02 13:18) [6]

RTFM?

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


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

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


 
Soft ©   (2004-03-03 04:00) [8]

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

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


 
y-soft ©   (2004-03-03 17:47) [9]

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

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


 
AlexeyITN   (2004-03-03 17:56) [10]

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;                                }


 
DillerXX ©   (2004-03-03 20:31) [11]

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


 
y-soft ©   (2004-03-03 20:57) [12]

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

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


 
Alexander666 ©   (2004-03-04 04:39) [13]

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



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

Текущий архив: 2004.05.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.038 c
14-1081367620
ginfonic
2004-04-07 23:53
2004.05.02
Продам труды Архангельского по Delphi 7


7-1078808748
Shark
2004-03-09 08:05
2004.05.02
Delphi и SIEMENS S7


7-1078809077
lucky4me
2004-03-09 08:11
2004.05.02
phone via voice modem


8-1076051433
Onward
2004-02-06 10:10
2004.05.02
SetPixel??????????


4-1078409381
Kreon
2004-03-04 17:09
2004.05.02
ScaleViewportExtEx, логические единицы - как их изменять?