Интересный глюк

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Интересный глюк

Сообщение kuhtiov » 05.07.2010 (Пн) 13:22

В программе реализована функция автообновления. Схема следующая, есть два исполняемых файла:
Programs.exe и updater.exe. Программа “programs.exe” при запуске запускает файл “updater.exe”. “updater.exe” в свою очередь проверяет наличие обновлений на сайте для файла “programs.exe”. Если есть обновление для “programs.exe”, она (updater.exe) убивает процесс “programs.exe”, скачивает исполняемый файл, запускает “programs.exe”, после чего “updater.exe” выгружается. Все бы хорошо, но есть одно НО! В программе “programs.exe” есть такой код
Код: Выделить всё
If App.PrevInstance = True Then
       
PushButton = MsgBox("Программа уже запущена. Повторный запуск запрещен", 16, " programs.exe")
End
End If




И когда после обновления пытается запуститься программа “programs.exe”, вылазит ошибка "Программа уже запущена. Повторный запуск запрещен”. Тут сразу можно было предположить, что процесс висит в памяти, НО файл “programs.exe” успешно заменился, соответственно, он не мог быть запущен иначе была бы ошибка. Если нажать “Ok” и запустить программу повторно, она превосходно загружается. Скажите, с чем может быть связан такой глюк?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Интересный глюк

Сообщение iGrok » 05.07.2010 (Пн) 14:01

А если подождать завершения после убиения процесса?
WaitForSingleObject, все дела..
label:
cli
jmp label

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Интересный глюк

Сообщение kuhtiov » 05.07.2010 (Пн) 14:35

Хм.... кажется я начинаю понимать происхождение глюка, но не понимаю как его решить
Код: Выделить всё
Private sub Form_Load()

....
                           If GetApp(PathProg & "\programs.exe") = True Then
                           
                                bRet = GetApp(PathProg & "\programs",True)
                               

                                'hProcess = OpenProcess(SYNCHRONIZE, 0, Shell(PathProg & "\programs", vbNormalFocus))

                                WaitForSingleObject hProcess, INFINITE
                           
                            End If
....
end sub


Function GetApp(sAppFile As String, Optional Terminate As Boolean = False) As Boolean   ' Äëÿ óáèéñòâà ïðîöåññîâ
On Error Resume Next
    Dim hSnapShot As Long, uProcess As PROCESSENTRY32
    Dim rProcessFound As Long
    Dim sFileName As String
    Dim lFLenght As Long
    Dim lhProcess As Long
   
    hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
    uProcess.dwSize = Len(uProcess)
    rProcessFound = Process32First(hSnapShot, uProcess)
       
    Do While rProcessFound
        sFileName = Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, _
                            InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0))
        lFLenght = Len(sFileName)
        If LCase(sFileName) = LCase(Right(sAppFile, lFLenght)) Then
            If Terminate Then
                lhProcess = OpenProcess(PROCESS_TERMINATE, False, uProcess.th32ProcessID)
                TerminateProcess lhProcess, 0&
                CloseHandle lhProcess
            End If
            GetApp = True
        End If
        rProcessFound = Process32Next(hSnapShot, uProcess)
    Loop
   
    CloseHandle hSnapShot
End Function



Было
Код: Выделить всё
    bRet = GetApp(PathProg & "\programs",True)
, поменял на
Код: Выделить всё
    bRet = GetApp(PathProg & "\programs",False)


Теперь, программа матерится, но продолжает запускаться O_o

P.S. Если сделать WaitForSingleObject, то программа судя по всему пытается еще раз запуститься, т.е. у меня это сообщение стало вываливаться не один раз, а 2 раза подряд. ч.з.х?

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Интересный глюк

Сообщение kuhtiov » 05.07.2010 (Пн) 14:45

хм.. разобрался. У меня после того как файл скачивался, был код
Код: Выделить всё
Shell PathProg & "\WinRepository.exe"
. Закоментил его и все заработало. Не понимаю правда почему?

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Интересный глюк

Сообщение kuhtiov » 05.07.2010 (Пн) 14:50

А нет, ошибочка. Вообще не обновляется :( блин блинский

hclubmk
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 240
Зарегистрирован: 19.06.2009 (Пт) 14:23
Откуда: От-туда

Re: Интересный глюк

Сообщение hclubmk » 05.07.2010 (Пн) 14:58

kuhtiov писал(а):она (updater.exe) убивает процесс “programs.exe”

а просто закрыть мессагой?
Научились ли Вы радоваться трудностям?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Интересный глюк

Сообщение iGrok » 05.07.2010 (Пн) 16:47

Вот смотрю я код, и не понимаю, что же это ты такое тяжёлонаркотическое употреблял?

Во-первых, за каким чёртом ты два раза вызываешь свой "GetApp"?
Во-вторых, если ты запускаешь апдейтер из основной программы, почему не передать ему сразу PID основной программы, и зачем надо её по всей винде искать?
В-третьих, если оба приложения твои, то почему-бы не воспользоваться IPC для того, чтобы дать основному сигнал на завершение, вместо того, чтобы стрелять ему в бошку из гранатомёта (TerminateProcess)?
label:
cli
jmp label

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Интересный глюк

Сообщение kuhtiov » 05.07.2010 (Пн) 17:57

iGrok писал(а):Вот смотрю я код, и не понимаю, что же это ты такое тяжёлонаркотическое употреблял?

Во-первых, за каким чёртом ты два раза вызываешь свой "GetApp"?
Во-вторых, если ты запускаешь апдейтер из основной программы, почему не передать ему сразу PID основной программы, и зачем надо её по всей винде искать?
В-третьих, если оба приложения твои, то почему-бы не воспользоваться IPC для того, чтобы дать основному сигнал на завершение, вместо того, чтобы стрелять ему в бошку из гранатомёта (TerminateProcess)?


У меня был пример убийства процесса, вот я и решил им воспользоваться. Второй вызов GetApp, я убрал. Заметил, что в Windows 7 такой глюк не наблюдается.

Пользоваться IPC, думаю не стоит. Вдруг программа по какой-то причине не выгрузится, файл не подменяться. Стрелять ему в бошку из гранатомёта Надежнее. Тем более что в моем случаи, это безопасно. Если ошибаюсь, поправьте.

Особист
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 122
Зарегистрирован: 10.05.2006 (Ср) 12:46

Re: Интересный глюк

Сообщение Особист » 05.07.2010 (Пн) 18:58

Я автообновление решал так:
- лежат в папке 2 ехе: launch.exe и prog.exe
- основной запускаемый файл, у меня он зовётся launch.exe - программа, которая проверяет обновление и если находит, то перезаписывает старый файл prog.exe новым (скажем этот файл зовется prog.exe).
- если обновление закачано, или не требуется, с помощью shell запускаем основной exe.

Раньше пробовал как автор топика, но быстро отказался именно из-за подобных багов.
RANDOMIZE USR 15619: REM: LOAD "VBSTREETS"

kuhtiov
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 419
Зарегистрирован: 03.08.2006 (Чт) 5:31

Re: Интересный глюк

Сообщение kuhtiov » 06.07.2010 (Вт) 5:21

Особист писал(а):Я автообновление решал так:
- лежат в папке 2 ехе: launch.exe и prog.exe
- основной запускаемый файл, у меня он зовётся launch.exe - программа, которая проверяет обновление и если находит, то перезаписывает старый файл prog.exe новым (скажем этот файл зовется prog.exe).
- если обновление закачано, или не требуется, с помощью shell запускаем основной exe.

Раньше пробовал как автор топика, но быстро отказался именно из-за подобных багов.


Это не совсем правильно, т.е. например при запуске программе в windows 7, винда каждый раз будет спрашивать разрешение на запуск второй программы.

Особист
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 122
Зарегистрирован: 10.05.2006 (Ср) 12:46

Re: Интересный глюк

Сообщение Особист » 06.07.2010 (Вт) 9:43

kuhtiov, я теоретически предполагал что так может быть, поэтому свой обновляемый исполняемый файл назвал не prog.exe, а prog.dll (к примеру) и Shell'ом запускал. Проверял на Win 7 и в Висте - запроса на подтверждение запуска не было, хотя вообще он присутствует.
PS сама запускаемая программа у меня копировалась / качалась в Application Data, и оттуда же запускалась с помощью Shell.
RANDOMIZE USR 15619: REM: LOAD "VBSTREETS"


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 104

    TopList