Программа не запускается (31)
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Общие вопросы

#1: Программа не запускается (31) Author: PliniusLocation: Владимир PostPosted: Tue May 27, 2014 08:26
    —
Речь пойдёт не об аналогичной ошибке при запуске ярлыков, как подумали некоторые. Smile Речь пойдёт про запуск конкретных исполняемых файлов с расширением 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 всё запускается.

#2:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue May 27, 2014 08:58
    —
Plinius
Ссылку на файл — мне в личку. В общем виде это обсуждать бессмысленно, надо смотреть конкретно.

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

Ссылка на файл. Я сам смогу проверить только вечером.

#3:  Author: MVVLocation: Ростов-Дон PostPosted: Tue May 27, 2014 10:22
    —
Действительно интересно, в 8.50 beta 2 x64 уже не запускается, а в 8.01 x64 ещё запускается.

Ага, полагаю, это связано с этим:
Quote:
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, раз графическая запускается).

#4:  Author: CaptainFlintLocation: Москва PostPosted: Tue May 27, 2014 14:18
    —
MVV wrote:
Вообще удивлён, что в 64-битной винде запускаются 16-битные экзешники. Был уверен, что 16-битной подсистемы в ней нет вообще (но видимо, это касается только программ под DOS, раз графическая запускается).

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

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


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

Резюме: Мистики с 16-битками никакой не обнаружилось, а баг я зарепортил.

#5:  Author: MVVLocation: Ростов-Дон PostPosted: Tue May 27, 2014 14:45
    —
Да, похоже, инструмент совместимости определяет, что это установщик InstallShield, и запускает системный 32-битный Setup.exe.

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

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

#6:  Author: PliniusLocation: Владимир PostPosted: Tue May 27, 2014 15:13
    —
CaptainFlint wrote:
а баг я зарепортил.

Большое спасибо. Smile

#7:  Author: PliniusLocation: Владимир PostPosted: Wed May 28, 2014 18:25
    —
Интересное наблюдение.

По пути
Code:
C:\Windows\SysWOW64\InstallShield\

находятся три файла
Code:
setup.exe
_setup.dll
_isdel.exe

Эти же три файла присутствуют в дистрибутиве моей старой программы. Берём, заменяем старые копии файлов из указанного выше каталога новыми - и вуаля - программа запускается под Тоталом 8.51a x64 и к тому же устанавливается корректно. Ловкость рук и никакого мошенничества. Smile

#8:  Author: MVVLocation: Ростов-Дон PostPosted: Wed May 28, 2014 19:05
    —
Plinius,
Ничего интересного, просто более новая версия InstallShield, 32-битная, а не 16-битная.

#9:  Author: CaptainFlintLocation: Москва PostPosted: Thu May 29, 2014 15:54
    —
Гислер ответил, что это намеренное поведение, исправлять не планируется. Проблема в том, что Тотал не может заранее отличить такой "запускающийся" 16-битный файл от любого другого, а попытка запуска обычной 16-битной программы вызывает падение в системной функции. Поэтому Гислер запретил запуск всех 16-битных приложений из 64-битного Тотала.

#10:  Author: PliniusLocation: Владимир PostPosted: Thu May 29, 2014 18:12
    —
Жаль, конечно. Тем более что под проводником всё работает исправно, никаких сбоев не возникает. Так пользователь может быть сбит с толку, что программа не запускается, хотя это не так.

Да, в 90-е годы довольно часто делали полностью 32-битные программы, хотя инсталляторы к ним оставались по-прежнему 16-битными. Раньше это было некритично, а сейчас этот момент стал ощущаться.

#11:  Author: FlasherLocation: Москва PostPosted: Thu May 29, 2014 21:11
    —
Plinius
Предлагаю навесить во внутренних ассоциациях запуск exe проводником.

#12:  Author: MVVLocation: Ростов-Дон PostPosted: Thu May 29, 2014 22:58
    —
Можно запускать через Exec.exe из комплекта моей виртуальной панели, там как раз 32-битный лаунчер. Ещё можно через Shift+Enter или Ctrl+Enter и Enter.

#13:  Author: PliniusLocation: Владимир PostPosted: Fri May 30, 2014 22:34
    —
MVV wrote:
Ещё можно через Shift+Enter или Ctrl+Enter и Enter.
Да, это быстрый способ. Спасибо за советы. Smile



Total Commander -> Общие вопросы


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group