Форум: "WinAPI";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
ВнизПовторный запуск Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.034 c