powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Странные глюки из-за Shell "proga.exe", vbNormalFocus
9 сообщений из 9, страница 1 из 1
Странные глюки из-за Shell "proga.exe", vbNormalFocus
    #37760309
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос какой-то мистический.
Собственно тестовая программа в итоге состоит из одной строчки.
Код: vbnet
1.
2.
3.
Private Sub Command1_Click()
    Shell "proga.exe", vbNormalFocus
End Sub


где proga.exe -консольное приложение C++, очень навороченное и сложное, телефония в общем.
Так вот, я его всегда несколько лет этим shell запускаю, и никаких проблем.
Короче внес некие нехилые изменения в proga.exe, при тестировании все работало отлично,
дописал "морду настроек" на VB как обычно (параметры сохранюются в реестре, proga.exe их оттуда берет не суть).
Все готово, на XP все отлично работает, собрал инсталлятор, и вот те раз:

При выполнении определенной процедуры "proga.exe has stopped working".

Короче симптомы такие:
1) crash никогда не происходит на XP/Win2003
2) вероятность crash на Vista/Win7 x64 ничтожно мала, но таки бывает
3) вероятность crash на Vista/Win7 32 бит крайне высока.
4) если crash не произошел при первом выполнении этой процедуры (определенная процедура в proga.exe), то он не произойдет и при следующих выполнениях этой процедуры, т.е. при старте proga.exe как бы взводится в состояние "будет crash", или не взводится в это состояние, и это носит случайный характер. А если процедуру выполнять хоть сотни раз, то она crash не даст, если не глюканула с первого раза как произошла.

Я короче неделю дебажил эти сишные коды, пытался разобраться в цепочке функций, чего-то менял и ничего не помогает. При каком-то запуске proga.exe все равно войдет в состояние в котором сглючит.

Но тут меня осенило: вместо своей громоздкой оболочки я написал тест из одной приведенной строчки.
Shell "proga.exe"

Дык вот, crash происходит из-за shell, если запускать exe-шник двойным щелчком мыши (как обычно), то глюки уходят.
Я в панике, всегда думал что Shell() это то же самое что "ручками".
Что делать, на что менять Shell???
...
Рейтинг: 0 / 0
Странные глюки из-за Shell "proga.exe", vbNormalFocus
    #37760323
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

А ShellExecute пробовал?
...
Рейтинг: 0 / 0
Странные глюки из-за Shell "proga.exe", vbNormalFocus
    #37760353
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Да уже попробовал.
Код: vbnet
1.
2.
3.
4.
5.
6.
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Sub Command2_Click()
    Dim num As Long
    num = ShellExecute(0, "Open", Chr(34) & App.Path & "\proga.exe" & Chr(34), vbNullString, vbNullString, 1)
End Sub


Вроде не глючит.
Но хотелось бы каких-то гарантий и научного обоснования.
Это решает проблему, или может уменьшает вероятность? А где-нибудь на другом компе сглючит?
Или надо в сишных кодах дальше копаться? Или не надо? Но копаться уже достало.

Но там еще попутная проблема:
Есть еще режим запуска "Как сервис виндоус"
где proga.exe работает в оболочке
NSSM - the Non-Sucking Service Manager

Код запуска "сервиса" такой:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
StartNTService "proga"


' This function starts service
' It returns nonzero value on error
Public Function StartNTService(ServiceName As String) As Long
Dim hSCManager As Long, hService As Long
hSCManager = OpenSCManager(0&, 0&, _
                       SC_MANAGER_CONNECT)
If hSCManager Then
    hService = OpenService(hSCManager, StrPtr(ServiceName), SERVICE_START)
    If hService Then
        If StartService(hService, 0, 0) = 0 Then
            StartNTService = Err.LastDllError
        End If
    CloseServiceHandle hService
    Else
        StartNTService = Err.LastDllError
    End If
CloseServiceHandle hSCManager
Else
    StartNTService = Err.LastDllError
End If
End Function

Private Declare Function OpenSCManager _
      Lib "advapi32" Alias "OpenSCManagerW" _
      (ByVal lpMachineName As Long, ByVal lpDatabaseName As Long, _
      ByVal dwDesiredAccess As Long) As Long



А проблема та же: такой-же глюк.
Причем (кажется), если запускать сервис из оснастки "службы" ручками, то не глючит, а с вышепреведенным кодом глючит.
Здесь чего делать? Хорошо если я прав, хуже если эффект дает NSSM-оболочка.

net start proga ???
...
Рейтинг: 0 / 0
Странные глюки из-за Shell "proga.exe", vbNormalFocus
    #37760569
Фотография alix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДык вот, crash происходит из-за shell, если запускать exe-шник двойным щелчком мыши (как обычно), то глюки уходят.
Я в панике, всегда думал что Shell() это то же самое что "ручками".
Что делать, на что менять Shell???

Дебажить плюсовый код, ошибка там.
...
Рейтинг: 0 / 0
Странные глюки из-за Shell "proga.exe", vbNormalFocus
    #37761423
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Но там еще попутная проблема:
Есть еще режим запуска "Как сервис виндоус"
где proga.exe работает в оболочке

NSSM - the Non-Sucking Service Manager
Причем (кажется), если запускать сервис из оснастки "службы" ручками, то не глючит,
Хорошо если я прав, хуже если эффект дает NSSM-оболочка.

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

alixДебажить плюсовый код, ошибка там.
Да не, вы правы конечно, я тоже так думаю.
От этой мысли не легче.
Там проблема в том, что
1) есть dll
2) есть exe
dll претерпела за 2 года 3000 (!) транков.
автор dll добавил нужный мне новый функционал, но сделал это для "текущей версии" dll, то что было 2 года назад поддерживать не хочет
exe работает с тем, что было 2 года назад, с текущей версией dll не компилируется, не работает и автор exe 1.5 года как недоступен и на письма не отвечает
последовательно "пройдя" через эти 3000 релизов dll назад (есть свои методы, чтоб не совсем тупо), я вычленил нужные коды, добавил их в старую версию dll, и сделал код exe рабочим.
Естественно воспроизвести ошибку на тек. версии dll я не могу (чтоб долбать автора dll), т.к. exe с ним скомпилировать даже для теста нереально, а другое приложение на котором тестировался новый функционал с текущей версией dll глюков не дает.
Наедине с собой и километрами чужого кода короче. Баг трудно уловимый, хотя и научился его воспроизводить через Shell.
Буду удалять изменения последовательно, от труднопонимаемых логов толку все равно мало.
Но еще не факт что смогу исправить и совместить работоспособный функционал с отсутствием бага, даже если найду...

Почему именно 32-битные виста и семерка и почему shell?
...
Рейтинг: 0 / 0
Странные глюки из-за Shell "proga.exe", vbNormalFocus
    #37762227
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77alixДебажить плюсовый код, ошибка там.
Да не, вы правы конечно, я тоже так думаю.
От этой мысли не легче.
Уже легче. Нашел ошибку в сишном коде.
Короче была там функция MediaPatch::RemoveSink(const StreamPtr & stream), и больно сильно отличалась в старом и новом релизе, эксперименты показали что критично,
для совмещения версий нужны были оба варианта, а "совместить" мне такую штуку не по зубам.
Ну я сделал
RemoveSink()
RemoveSink_old()

и поставил "стрелку"
Код: plaintext
1.
2.
3.
4.
      if (connection.GetEndPoint().GetPrefixName() == "bla-bla-bla")
          patch->RemoveSink_old(this);
      else
          patch->RemoveSink(this);



а в другом месте осталось безусловное
Код: plaintext
1.
patch->RemoveSink(this);


а должно было быть хотя бы
Код: plaintext
1.
patch->RemoveSink_old;


проглядел...
А это ж телефония, там на миллисекунды счет, чуть задержка уже все поехало по другому сценарию, а все эти connection, mediastreams -все надо close, release, remove, update, ajust -чуть что не так, стрим подвис и -deadlock. Из за самого дебага может возникнуть миллисекундная задержка кот. поменяет сценарий.

Короче думаю Shell ни причем. Просто вносит случайную задержку (а на вистах она другая) и слабое место кода вылетает в аут.
Хорошо хоть наткнулся.

Или все же заменить его на ShellExecute?
Хотя думаю не стоит, стоял бы у меня ShellExecute, оно бы стало стрелять в режиме "Сервис Виндоус" (когда консоль на экран не выводится даже при тестах) и вообще ничего бы не понял.
...
Рейтинг: 0 / 0
Странные глюки из-за Shell "proga.exe", vbNormalFocus
    #37762505
Фотография alix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКороче думаю Shell ни причем.

Shell не причем. VB очень популярное средство разработки в мире, и любая ошибка компилятора была бы замечена много лет назад. "Баги" в VB6 появляются в основном из-за багов разработчиков новых версий ос. Например в 2009 году вышел малоизвестный апдейт для VB6 (это при том, что МС официально давно уже не поддерживает VB6), который исправляет ошибку работы с контролами в Windows7
...
Рейтинг: 0 / 0
Странные глюки из-за Shell "proga.exe", vbNormalFocus
    #37764139
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alixShell не причем.
Да понял уже, спасибо.
alixНапример в 2009 году вышел малоизвестный апдейт для VB6 (это при том, что МС официально давно уже не поддерживает VB6), который исправляет ошибку работы с контролами в Windows7
Что за апдейт?
Единственное что я делаю (из-за 64-битных Vista и Win7), это контролы надо регистрировать в реестре (доверяю инсталлятору в этом плане). Для XP/win2003 и кажется для 32-битных Vista/7 достаточно бухнуть контрол в папку с прогой.

А апдейтам что-то не доверяю. У меня после такого автоматического апдейта VC2005 EE года 2 назад скомпилированные C++ экзешники перестали запускаться на всех компах кроме "своего", пришлось откатывать систему и с тех пор к апдейтам отношусь с опаской.
...
Рейтинг: 0 / 0
Странные глюки из-за Shell "proga.exe", vbNormalFocus
    #37764280
Фотография alix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЧто за апдейт?

фикс к SP6, есть на сайте MSDN
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Странные глюки из-за Shell "proga.exe", vbNormalFocus
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]