![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск программы(только 1 копия) [D7, XP]
kyn66 © (2009-11-11 13:19:00)Добрый день. Решил применить вот этот способ для отслеживания запущенной программы при попытке повторного запуска. Дописываю в файл проекта.
...
Const AppID='ProgaOnlyOne';
Var
Handle:THandle;
begin
Handle:=CreateFileMapping($FFFFFFFF,Nil,PAGE_READONLY,0,1,AppID);
If GetLastError=ERROR_ALREADY_EXISTS then
MessageBox(0,'Запуск второй копии программы недопустим.',
AppID,MB_OK or MB_ICONSTOP or MB_TOPMOST)
else
begin
Application.Initialize;
Application.CreateForm(TDM1, DM1);
Application.CreateForm(TMainFrm, MainFrm);
Application.Run;
end;
// Освобождаем ресурс и тем самым разрешаем следующий запуск.
CloseHandle(Handle);
end.
Все работает по определению нормально. Что скажут мастера по эффективности такого метода? Есть ли для него какие подводные камни? И если прога спрятана в трее (иконка), то как ее при обнаружении поднять оттуда, как это делают многи программы?
Leonid Troyanovsky (2009-11-12 19:19:00) [1]
> Leonid Troyanovsky © (12.11.09 19:14) [56]
> и, сл-но, дальнейшие поиски излишни.
Ну, а захвативший мьютекс получает право создавать окна.
Хотя, во всей этой схеме родовой изъян - необходимость
именования объекта ядра.
--
Regards, LVT.
Leonid Troyanovsky (2009-11-12 19:14:00) [2]
> kyn66 © (12.11.09 10:55) [55]
> и не основной момент, но без него никак не поднять в данном
> предложенном варианте.[35]
Хороший вопрос.
Если запихать хендлы искомых окон в mmf, то нет
никакой гарантии, что с момента их прочтения они не
поменяют свою принадлежность к изначальным окнам.
В случае с мьютексом можно найти способ известить
ищущего нужное окно, о том, что владевший окном
поток бросил мютекс (WAIT_ABANDONED),
и, сл-но, дальнейшие поиски излишни.
Т.е., еще есть над чем подумать.
--
Regards, LVT.
kyn66 (2009-11-12 10:55:00) [3]
> вот это - основа. А то что внутри - механиз оповещения уже
> запущенной копии,
А поднимать из трэя как будет? По имени окна.... Хоть это и не основной момент, но без него никак не поднять в данном предложенном варианте.[35]
Riply (2009-11-12 03:11:00) [4]> [53] Игорь Шевченко © (12.11.09 02:55)
> antonn © (12.11.09 01:55) [52]
> А зачем {$WARNINGS OFF} ?
Для соместимости с unicode-версиями среды, наверное :)
Игорь Шевченко (2009-11-12 02:55:00) [5]antonn © (12.11.09 01:55) [52]
А зачем {$WARNINGS OFF} ?
antonn (2009-11-12 01:55:00) [6]
> kyn66 © (12.11.09 01:14) [51]
{$WARNINGS OFF}
hMutex := CreateMutex(Nil, true , PAnsiChar(aName));
{$WARNINGS ON}
if GetLastError = ERROR_ALREADY_EXISTS then
Begin
вот это - основа. А то что внутри - механиз оповещения уже запущенной копии, передачи ей данных и прочего. О чем в [0] не сказано, можно поудалять.
kyn66 (2009-11-12 01:14:00) [7]
> antonn © (11.11.09 22:14) [45]
> > kyn66 © (11.11.09 20:22) [35]> > > > читал не внимательно,
> читай еще.> > > Что читать, за основу взят поиску по заглавию
> окна. А если > в процессе работы заглавие меняется?такой
> основы там нет.
if GetLastError = ERROR_ALREADY_EXISTS then
Begin
Result := False;
{$WARNINGS OFF}
hWnd := FindWindow('TApplication', PAnsiChar(aWndName));
{$WARNINGS ON}
if aMessage then
MessageBox(0, MSG_APP_ALREDY_EXIST, 'Внимание!', MB_ICONWARNING or MB_OK or MB_TOPMOST or MB_APPLMODAL);
If aFlash then
FlashWindow(hWnd, True);
If aRestore then
Begin
ShowWindow(hWnd, SW_RESTORE);
SetForegroundWindow(hWnd);
end;
end
Else
Result := True;
kyn66 (2009-11-12 01:09:00) [8]
> Игорь Шевченко © (11.11.09 22:00) [42]
> Leonid Troyanovsky © (11.11.09 21:58) [40] Начинающие
> вообще должны 7 лет отходы от набивки перфокарт за мастерами
> вытряхивать, прежде чем хоть что-то начать писать :)
Дедовщиной попахивает!
Leonid Troyanovsky (2009-11-11 23:04:00) [9]
> Anatoly Podgoretsky © (11.11.09 22:41) [46]
> Ну это общая практика TLVTStopTwo
Я б звал вТуСтепь.
> И ку
А то :)
--
Regards, LVT.
Anatoly Podgoretsky (2009-11-11 22:43:00) [10]> Leonid Troyanovsky (11.11.2009 22:03:43) [43]
И ку
Anatoly Podgoretsky (2009-11-11 22:43:00) [11]> Игорь Шевченко (11.11.2009 21:47:39) [39]
Ну один догадался включить букву "я" в первые 256 байтов проекта.
Anatoly Podgoretsky (2009-11-11 22:41:00) [12]> Leonid Troyanovsky (11.11.2009 21:45:38) [38]
Ну это общая практика TLVTStopTwo
antonn (2009-11-11 22:14:00) [13]
> kyn66 © (11.11.09 20:22) [35]
>
>
> > читал не внимательно, читай еще.
>
>
> Что читать, за основу взят поиску по заглавию окна. А если
> в процессе работы заглавие меняется?
такой основы там нет.
Loginov Dmitry (2009-11-11 22:06:00) [14]> Но, при запуске программы под другим пользователем(например,
> если вошли через удаленный рабочий стол) она запустится.
> Кстати, кто-нибудь знает, как от этого избавиться?
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1255714707&n=0&toprint=1
Leonid Troyanovsky (2009-11-11 22:03:00) [15]
> Игорь Шевченко © (11.11.09 22:00) [42]
> Начинающие вообще должны 7 лет отходы от набивки перфокарт
> за мастерами вытряхивать, прежде чем хоть что-то начать
> писать :)
Ну, во-щем-то, да.
И не забывать про медитацию.
--
Regards, LVT.
Leonid Troyanovsky (2009-11-11 22:00:00) [16]
> Leonid Troyanovsky © (11.11.09 21:45) [38]
Да, часть иронии была припасена для топикастера,
но, потом, как-то оно рассосалось.
--
Regards, LVT.
Игорь Шевченко (2009-11-11 22:00:00) [17]Leonid Troyanovsky © (11.11.09 21:58) [40]
Начинающие вообще должны 7 лет отходы от набивки перфокарт за мастерами вытряхивать, прежде чем хоть что-то начать писать :)
Leonid Troyanovsky (2009-11-11 21:58:00) [18]
> Игорь Шевченко © (11.11.09 21:47) [39]
> Что-то страсти какие-то рассказываются, про то, что файл
> проекта нельзя править :)
Начинающим - нельзя.
Запрещаю я :)
--
Regards, LVT.
Игорь Шевченко (2009-11-11 21:47:00) [19]
> Особенно не нравятся рекомендации о правке файла проекта,
>
> куда начинающим путь, во-ще, заказан.
Что-то страсти какие-то рассказываются, про то, что файл проекта нельзя править :)
Борланд вроде не запрещает.
Leonid Troyanovsky (2009-11-11 21:45:00) [20]
> Anatoly Podgoretsky © (11.11.09 21:21) [37]
> Рассмешили и все равно не понятно.
Да, не хотелось тот код обсуждать, бо с 2003 года лежит себе спокойно.
Без грубых ошибок, но и не без огрехов.
Особенно не нравятся рекомендации о правке файла проекта,
куда начинающим путь, во-ще, заказан.
Сложная проблема и с именованием объектов, хотя предложение
добавлять префиксом имя автора - весьма остроумно.
Ну, и мелочи всякие, сырой код, на коленке деланный,
а изображен как всамделишный.
--
Regards, LVT.