1. Pascal / Говнокод #12714

    +96

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    procedure TForm1.FormCreate(Sender: TObject);
    var formattedDateTime : string; S: TSearchRec; sf : Int64;
    begin
      Application.OnException := MyHandler;
      if IsRunningEXEName(ExtractFileName(Application.ExeName)) = true then
      begin
        Application.Terminate;
        Exit;
      end;

    Попытка запретить запуск копии программы. Неудачная.

    Запостил: increazon, 09 Марта 2013

    Комментарии (26) RSS

    • Видит себя и делает сеппуку? ;)
      Ответить
      • Блин. Я минуты две тупил, пытаясь понять проблему. То ли, думаю, системные функции лажают, то ли еще что...
        Пойду тоже сеппуку сделаю. Или посплю. :)
        Ответить
    • мьютексы же есть.
      вариант: создавать лок-файл, или открывать сокет.
      Ответить
      • Ну и на крайний случай, если про мутексы не знаем, можно и через FindWindow, но в самом начале проги, до создания форм.
        Ответить
        • а Java не может в выньдовз АПИ, как тогда быть?
          Ответить
          • > а Java не может в выньдовз АПИ, как тогда быть?
            Юзать JNA или JNI.

            P.S. Тут же делфи, а для старых делфей (а я чуть менее чем уверен, что тут говнокодили на седьмой) что FindWindow что мутексы - винапишные костыли.
            Ответить
          • P.S. А если серьезно, в яве есть какие-то стандартные средства для IPC кроме сокетов?
            Ответить
        • искать свое имя в списке процессов кошернее будет)
          Ответить
          • Мутекс всего пару строк займет. Поиск процесса по имени всяко сложнее и нестабильнее.
            Ответить
      • MUTEX установлен, но не работает при запуске из разных пользователей виндовс хр.
        Ответить
        • почему не работает? SECURITY_ATTRIBUTES? Object namespaces?
          Ответить
        • если приложение запускается из под обычного пользователя, то ему не нужно знать о других пользователях. А то ж расплодилось куча хелловордов, которые без рута не работают
          Ответить
      • Именованный канал. Правда, хрен знает, как оно будет с правами.
        Я делал с виндовыми мьютексами, но в самом деле, никогда не проверял запуск от разных пользователей.
        Ответить
        • > Правда, хрен знает, как оно будет с правами.
          In my app I use ConvertStringSecurityDescriptorToSecurityDescriptor and pass this string descriptor: D:(A;OICI;GRGW;;;AU). That grants read/write access for authenticated users.

          WinAPI. Просто и наглядно.
          Ответить
          • BOOL AccessCheckByTypeResultListAndAuditAlarmByHandle
            (
                LPCTSTR SubsystemName,
                LPVOID HandleId,
                HANDLE ClientToken,
                LPCTSTR ObjectTypeName,
                LPCTSTR ObjectName,
                PSECURITY_DESCRIPTOR pSecurityDescriptor,
                PSID PrincipalSelfSid,
                DWORD DesiredAccess,
                AUDIT_EVENT_TYPE AuditType,
                DWORD Flags,
                POBJECT_TYPE_LIST ObjectTypeList,
                DWORD ObjectTypeListLength,
                PGENERIC_MAPPING GenericMapping,
                BOOL ObjectCreation,
                LPDWORD GrantedAccess,
                LPDWORD AccessStatusList,
                LPBOOL pfGenerateOnClose
            );
            Ответить
          • Тебе повезло, что там всего лишь D:(A;OICI;GRGW;;;AU), а не D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLC SWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCR RC;;;AU)(A;;CCLCSWRPWPDTLOCRRC;;;PU):
            http://govnokod.ru/23383#comment390615
            Ответить
    • Решение проблемы - работающая программа пишет в INI файл DateTime каждые 5 секунд. Копия при запуске считывает это значение и вычисляет разницу в секундах от текущего времени до записанного в файл. Если разница менее 17 секунд - закрывается копия. Гениальное решение!
      Ответить
      • @Lure Of Chaos > вариант: создавать лок-файл

        Попробуйте просто открыть файл в эксклюзивном режиме. Второй процесс при этом обломается, и получит ошибку. И никакого таймера не нужно ;)
        Ответить
    • А мне помнится, что win при запуске передаёт программе дескриптор главного окна предыдущего запущенного экземпляра этого же экзешника. Специально для таких вот ситуаций.

      UPD: второй параметр, передаваемый winmain(). не оно?
      Ответить
      • Емнип оно вроде только в винде 3.11 работало, и осталось в качестве неработающего атавизма...
        Ответить
    • показать все, что скрыто
      * g o a t s e x * g o a t s e x * g o a t s e x *  
       g                                               g  
       o /     \             \            /    \       o  
       a|       |             \          |      |      a  
       t|       `.             |         |       :     t  
       s`        |             |        \|       |     s  
       e \       | /       /  \\\   --__ \\       :    e  
       x  \      \/   _--~~          ~--__| \     |    x  
       *   \      \_-~                    ~-_\    |    *  
       g    \_     \        _.--------.______\|   |    g  
       o      \     \______// _ ___ _ (_(__>  \   |    o  
       a       \   .  C ___)  ______ (_(____>  |  /    a  
       t       /\ |   C ____)/      \ (_____>  |_/     t  
       s      / /\|   C_____)       |  (___>   /  \    s  
       e     |   (   _C_____)\______/  // _/ /     \   e  
       x     |    \  |__   \\_________// (__/       |  x  
       *    | \    \____)   `----   --'             |  *  
       g    |  \_          ___\       /_          _/ | g  
       o   |              /    |     |  \            | o  
       a   |             |    /       \  \           | a  
       t   |          / /    |         |  \           |t  
       s   |         / /      \__/\___/    |          |s  
       e  |         / /        |    |       |         |e  
       x  |          |         |    |       |         |x  
       * g o a t s e x * g o a t s e x * g o a t s e x *
      Ответить

    Добавить комментарий