Программа не запускается (31)

Обсуждение Total Commander. Установка, использование, настройка, решение проблем, скрытые функции. Обсуждение новых версий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Ответить
Plinius
Сообщения: 7
Зарегистрирован: Ср окт 29, 2008 12:34
Откуда: Владимир

Программа не запускается (31)

Сообщение Plinius »

Речь пойдёт не об аналогичной ошибке при запуске ярлыков, как подумали некоторые. :) Речь пойдёт про запуск конкретных исполняемых файлов с расширением exe.

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

Что имеем? Windows 7 x64 SP1. Тотал - официальная версия 8.51а x64, установленная на компьютере. Ещё имеем одну старенькую программу (не суть важно какую), инсталлятор которой запускается программой setup.exe. При попытке запуска указанного файла под Тоталом получаем известное окно ошибки: "Программа не запускается! (31)".

Я сначала не понял в чём дело, т.к. чётко помню, что раньше под Тоталом спокойно запускал эту программу. Действительно, удаляю 8.51a x64 с файлами настроек и устанавливаю также официальный 8.01 x64. Запускаю этот setup.exe - и, о чудо, всё запускается. Сношу 8.01 x64, ставлю обратно 8.51a x64 - опять получаю окно с ошибкой (31). Поменял 64-битную 8.51a на 32-битную. Уже всё стало запускаться. Насчёт 32-разрядной версии 8.50 не скажу, не пробовал, но под 64-битной 8.50 эта программа также не запускалась. В итоге, получается, что моя программа почему-то не очень дружит с последними версиями Тотала разрядности x64.

По данной ситуации у меня вопрос: в новых версиях у меня какие-то неверные настройки 64-битного Тотала или это его глюк? Если кто захочет промоделировать эту ситуацию, то могу скинуть на файлообменник файл setup.exe, на котором вылетает ошибка 31. Если модератор разрешит, то ссылку выложу в теме. Если нет, то дам по запросу в личке. Естественно, при запуске этого файла он ругнётся на отсутствие других установочных файлов, но тут важно другое - либо программа запустится и ругнётся на отсутствие других файлов, либо уже ругнётся сам Тотал, т.е. почему-то не захочет запустить этот файл. Под проводником Windows всё запускается.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Plinius
Ссылку на файл — мне в личку. В общем виде это обсуждать бессмысленно, надо смотреть конкретно.

Добавлено спустя 56 минут:

Ссылка на файл. Я сам смогу проверить только вечером.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Действительно интересно, в 8.50 beta 2 x64 уже не запускается, а в 8.01 x64 ещё запускается.

Ага, полагаю, это связано с этим:
14.04.13 Fixed: Do not try to run 16-bit programs from 64-bit TC, they cause a segmentation fault in ShellExecuteEx (64)
Вообще удивлён, что в 64-битной винде запускаются 16-битные экзешники. Был уверен, что 16-битной подсистемы в ней нет вообще (но видимо, это касается только программ под DOS, раз графическая запускается).
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

MVV писал(а):Вообще удивлён, что в 64-битной винде запускаются 16-битные экзешники. Был уверен, что 16-битной подсистемы в ней нет вообще (но видимо, это касается только программ под DOS, раз графическая запускается).
А они и не запускаются. И неважно, графическая или нет. Например, программа SHED для редактирования SHG-изображений 16-битная и графическая, но не запускается (что ощутимо ударило в своё время по моей работе над русиком Тотала, т. к. интерактивные картинки в HLP-справке сделаны именно в SHG-формате).

А с данным инсталлятором всё обстоит оччень любопытненько. Если его запустить, а потом посмотреть информацию о процессе, будет видно, что на самом деле образ процесса принадлежит файлу C:\Windows\SysWOW64\InstallShield\setup.exe, несмотря на то, что командная строка выглядит следующим образом:

Код: Выделить всё

"C:\Temp\SETUP.EXE" -isw64"C:\Temp\SETUP.EXE"
Если проследить через Process Monitor, то видно, что запускается именно InstallShield, и что вышеприведённая командная строка является такой сразу же при инициализации процесса. Далее, если посмотреть чуть выше, то обнаруживается, что процесс Тотала (а, вернее, системная библиотека, сидящая в его памяти, через которую Тотал выполняет запуск программ) дёргает файлик C:\Windows\AppPatch\sysmain.sdb, то есть включается механизм обеспечения совместимости приложений. И у меня сильное подозрение, что именно в этом файлике прописан запуск InstallShield'а, если вдруг обнаруживается, что запускаемый файл — инсталлятор, построенный именно на этой технологии (как в нашем случае). В результате винда запускает 32-битный InstallShield, передавая ему наш 16-битный инсталлятор, и никакого запуска 16-битной программы не происходит. Инсталлятор просто распаковывает файл своими средствами.

Резюме: Мистики с 16-битками никакой не обнаружилось, а баг я зарепортил.
Почему же, ё-моё, ты нигде не пишешь "ё"?
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Да, похоже, инструмент совместимости определяет, что это установщик InstallShield, и запускает системный 32-битный Setup.exe.

А мистику мы не имели возможности обнаружить, т.к. система на самом деле не запускала 16-битный процесс, а запускала вместо него 32-битный. Вот если изменить экзешник, чтобы он по базе не пробивался...

В любом случае, не думаю, что есть смысл полагаться на патчи совместимости при определении, что запускать, а что - нет, уж очень их много, и уж очень они кривые...
Plinius
Сообщения: 7
Зарегистрирован: Ср окт 29, 2008 12:34
Откуда: Владимир

Сообщение Plinius »

CaptainFlint писал(а):а баг я зарепортил.
Большое спасибо. :)
Plinius
Сообщения: 7
Зарегистрирован: Ср окт 29, 2008 12:34
Откуда: Владимир

Сообщение Plinius »

Интересное наблюдение.

По пути

Код: Выделить всё

C:\Windows\SysWOW64\InstallShield\
находятся три файла

Код: Выделить всё

setup.exe
_setup.dll
_isdel.exe
Эти же три файла присутствуют в дистрибутиве моей старой программы. Берём, заменяем старые копии файлов из указанного выше каталога новыми - и вуаля - программа запускается под Тоталом 8.51a x64 и к тому же устанавливается корректно. Ловкость рук и никакого мошенничества. :)
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Plinius,
Ничего интересного, просто более новая версия InstallShield, 32-битная, а не 16-битная.
Аватара пользователя
CaptainFlint
Сообщения: 6239
Зарегистрирован: Вт дек 14, 2004 22:34
Контактная информация:

Сообщение CaptainFlint »

Гислер ответил, что это намеренное поведение, исправлять не планируется. Проблема в том, что Тотал не может заранее отличить такой "запускающийся" 16-битный файл от любого другого, а попытка запуска обычной 16-битной программы вызывает падение в системной функции. Поэтому Гислер запретил запуск всех 16-битных приложений из 64-битного Тотала.
Почему же, ё-моё, ты нигде не пишешь "ё"?
Plinius
Сообщения: 7
Зарегистрирован: Ср окт 29, 2008 12:34
Откуда: Владимир

Сообщение Plinius »

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

Да, в 90-е годы довольно часто делали полностью 32-битные программы, хотя инсталляторы к ним оставались по-прежнему 16-битными. Раньше это было некритично, а сейчас этот момент стал ощущаться.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Plinius
Предлагаю навесить во внутренних ассоциациях запуск exe проводником.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Можно запускать через Exec.exe из комплекта моей виртуальной панели, там как раз 32-битный лаунчер. Ещё можно через Shift+Enter или Ctrl+Enter и Enter.
Plinius
Сообщения: 7
Зарегистрирован: Ср окт 29, 2008 12:34
Откуда: Владимир

Сообщение Plinius »

MVV писал(а):Ещё можно через Shift+Enter или Ctrl+Enter и Enter.
Да, это быстрый способ. Спасибо за советы. :)
Ответить