Конференция "WinAPI" » "Прибить" повторный запуск моей проги. [D7, Win2k, WinXP]
 
  • Dmitry S © (05.02.08 20:23) [0]
    Так нормально:

     CreateMutex(nil, true, mutex_name);
     if GetLastError = ERROR_ALREADY_EXISTS then
       halt(0);

  • Leonid Troyanovsky © (05.02.08 20:32) [1]

    > Dmitry S ©   (05.02.08 20:23)

    > Так нормально:

    Случаи бывают разные.
    Одна на десктопе, в сессии, на хосте, в домене и т.д.

    Да и, во-ще, важнее цель.
    И почему, собс-но, мьтекс.

    --
    Regards, LVT.
  • Dmitry S © (05.02.08 20:39) [2]
    Мне нужно, что-бы два экземпляра программы не работали одновременно в одном сеансе. (Или компьютере, т.к. не предвидится использование терминалов или быстрого переключения пользователей)

    Простая защита от случайного запуска второго экземпляра.

    Мьютекс, честно говоря, потому, что гдето слышал, что это делается с помощью них. Мьютекс я себе представляю аналогом критической секции.

    Есть способы лучше (проще, правильнее)?
  • DVM © (05.02.08 21:09) [3]

    > Есть способы лучше (проще, правильнее)?

    Правильнее и лучше чем мьютекс, наверное, нет. Чем мьютекс то не угодил?
  • Leonid Troyanovsky © (05.02.08 21:38) [4]

    > Dmitry S ©   (05.02.08 20:39) [2]

    > Мьютекс, честно говоря, потому, что гдето слышал, что это
    > делается с помощью них. Мьютекс я себе представляю аналогом
    > критической секции.

    В рассматриваемом случае полезные свойства мьютекса никак
    не используются. На его месте может быть любой именованный
    объект ядра. На мой вкус memory mapped file намного полезней,
    бо может хранить некую полезную информацию, скажем, хендл
    окна ранее запущенного приложения или параметры комстроки.

    --
    Regards, LVT.
  • Dmitry S © (06.02.08 07:14) [5]

    > намного полезней

    Это всеравно что сравнивать Except и Finally. Мне ведь не нужны ни хендл ни параметры. У меня программа-поздравительная открытка. Просто будет мерзко звучать и выглядеть, если будет запущена дважды одновременно:)
  • miek (06.02.08 09:12) [6]
    использовать для этой цели мутекс - стандартный способ.
    только не забывай делать мутексу _уникальное_ имя. обычно для этого берется полный путь к exe-шнику и все слеши заменяются на обратный слеш.
  • Ins © (06.02.08 10:47) [7]

    > На мой вкус memory mapped file намного полезней,
    > бо может хранить некую полезную информацию, скажем, хендл
    > окна ранее запущенного приложения или параметры комстроки.


    Я тоже так считаю. Порой важно еще не только запретить запуск второй копии, но и передать от второй копии первой копии командную строку (например, юзер попытался открыть файл двойным кликом по нему, когда одна копия уже запущена). А с помощью MMF мы убиваем сразу трех зайцев - и именованный объект, и хранилище хэндла окна первого экземпляра, и контейнер для передачи командной строки.
  • Leonid Troyanovsky © (06.02.08 12:40) [8]

    > Dmitry S ©   (06.02.08 07:14) [5]

    > Это всеравно что сравнивать Except и Finally. Мне ведь не
    > нужны ни хендл ни параметры.

    Не знаю, что ты с чем сравниваешь, но хендл окна первопущенной
    программы вполне мог бы пригодиться.
    Ничто так не раздражает юзера как его игнорирование.

    Кста, не вижу ничего мерзкого в том, чтобы поздравить
    себя хоть дважды.

    --
    Regards, LVT.
  • Anatoly Podgoretsky © (06.02.08 13:41) [9]
    > Leonid Troyanovsky  (06.02.2008 12:40:08)  [8]

    Таймер?
  • Leonid Troyanovsky © (06.02.08 17:57) [10]

    > Anatoly Podgoretsky ©   (06.02.08 13:41) [9]

    > Таймер?

    Ну, это уже не случайность :)

    --
    Regards, LVT.
  • Dmitry S © (07.02.08 17:12) [11]

    > Leonid Troyanovsky ©

    В этой теме я выложил готовый вариант программы:
    http://pda.delphimaster.net/?id=1202392451&n=3

    Как вы считаете для подобной программы нужно передавать первому экземпляру какие либо данные?
  • Leonid Troyanovsky © (07.02.08 17:31) [12]

    > Dmitry S ©   (07.02.08 17:12) [11]

    > Как вы считаете для подобной программы нужно передавать
    > первому экземпляру какие либо данные?

    Программу не смотрел, однако понял, что это оконное приложение.
    Тогда, пользу от запрета повторного запуска могу увидеть
    в активации первой копии (иначе юзер будет недоволен, см. [8]).
    Для подобной активации вторая копия должна получить
    хендл окна приложения (или формы), что легко достичь,
    используя mmf  (см. [7]).

    Целесообразность же передачи данных от второй к первой
    зависит от практики использования оной программы.

    --
    Regards, LVT.
  • Dmitry S © (07.02.08 18:19) [13]

    > в активации первой копии

    А там окна top most. Так что и этого не требуется. Более того не подразумевается какая либо работа на компьютере во время выполнения этой программы. (Программа представляет собой поздравительную валентинку).
  • Leonid Troyanovsky © (08.02.08 00:23) [14]

    > Dmitry S ©   (07.02.08 18:19) [13]

    > А там окна top most. Так что и этого не требуется. Более
    > того не подразумевается какая либо работа

    Если оное поздравление сгинет при любом нажатии клавиши
    либо шевелении мыши, то меня оно никак не огорчит.

    Однако, подозреваю, что поздравлять намеревались не меня.

    --
    Regards, LVT.
  • Anatoly Podgoretsky © (08.02.08 00:53) [15]
    > Leonid Troyanovsky  (08.02.2008 00:23:14)  [14]

    Поэтому пока и живой.
  • Anatoly Podgoretsky © (08.02.08 00:54) [16]
    Последнее время мой почтовик очень много режет "поздравлений и открыток"
 
Конференция "WinAPI" » "Прибить" повторный запуск моей проги. [D7, Win2k, WinXP]
Есть новые Нет новых   [134431   +14][b:0][p:0.001]