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

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

Мастера подскажите! Нужно запретить повторный запуск программы? [D5, Win95/98]


wer1 ©   (2002-10-10 03:55:00) 

Мастера подскажите! Нужно запретить повторный запуск программы?
В Faq был приведен код указанный ниже однако по каким то причинам
у меня он не отрабатывает, может быть есть какие либо моменты
которые в данном коде не учтены.
procedure TForm1.FormCreate(Sender: TObject);
begin
{Проверяем есть ли указатель на предыдущую копию приложения} IF hPrevInst <> 0 THEN BEGIN
{Если есть, то выдаем сообщение и выходим}
MessageDlg("Программа уже запущена!", mtError, [mbOk], 0); Halt;
END;
{Иначе - ничего не делаем (не мешаем созданию формы)}
end;


wer1   (2002-10-10 04:52:00) [1]

Я понял.Спасибо.


PVOzerski   (2002-10-10 04:43:00) [2]

hPrevinst - это наследие Win16, оставшееся для совместимости,
но фактически не функционирующее в Win32, где каждый процесс
имеет свое адресное пространство. Так что оставьте использование
hPrevinst для D1 и BPW, а в D5 используйте либо мутексы (что все рекомендуют),
либо FindWindow для окна-маркера с уникальным именем заголовка или
(что лучше) класса.


Rouse_   (2002-10-10 04:25:00) [3]

Вот как это реализовано в советах Озерова

В блоке begin..end модуля .dpr:



--------------------------------------------------------------------------------
begin

if HPrevInst <>0 then begin
ActivatePreviousInstance;
Halt;
end;
end;


Реализация в модуле:



--------------------------------------------------------------------------------
unit PrevInst;

interface

uses

WinProcs,
WinTypes,
SysUtils;

type
PHWnd = ^HWnd;

function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool; export;

procedure ActivatePreviousInstance;

implementation

function EnumApps(Wnd: HWnd; TargetWindow: PHWnd): bool;
var

ClassName : array[0..30] of char;
begin

Result := true;
if GetWindowWord(Wnd, GWW_HINSTANCE) = HPrevInst then begin
GetClassName(Wnd, ClassName, 30);
if STRIComp(ClassName,"TApplication")=0 then begin
TargetWindow^ := Wnd;
Result := false;
end;
end;
end;

procedure ActivatePreviousInstance;
var

PrevInstWnd: HWnd;
begin

PrevInstWnd := 0;
EnumWindows(@EnumApps,LongInt(@PrevInstWnd));
if PrevInstWnd <> 0 then
if IsIconic(PrevInstWnd) then
ShowWindow(PrevInstWnd,SW_Restore)
else
BringWindowToTop(PrevInstWnd);
end;

end.


Лично я обычно использую мутексы

Желаю успехов


wer1   (2002-10-10 04:13:00) [4]

Обязательно попробую следующие процедуры однако я хочу разобраться с первой из них, т.е которую я привел выше из того же FAQ.
Коль ее привели в качестве примера значит она должна работать,
а у меня она не реагируе на повторный запуск приложения, когда ставлю IF hPrevInst = 0 THEN BEGIN отрабатывает сообщение но насколько я правильно понял если =0 то это первый запуск, а
<>0 приложение уже запущено, однако именно это условие и не отрабатывает.


Николай Быков   (2002-10-10 04:01:00) [5]

http://delphi.mastak.ru/cgi-bin/faq.pl?look=1&id=988619824&n=15

Там подоробно все расписано

Там все учтено. Я сам делал так. Ты поробуй написать это без каких-либо изменений, а потом уж добавляй свое


Наверх

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