![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Повторный запуск [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]Создавай лучше мьютекс и проверяй при старте его наличие