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

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

Запуск программы(только 1 копия) [D7, XP]


Страницы:   1 2 3

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.


Страницы:   1 2 3

Наверх

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