Один из новых пользователей пожаловался, что мой установщик завершается, ничего не показав на экране, но заметил "какое-то моргание". Прислал логи установщика из двух систем — семерки и десятки. В обеих установщик нормально отрабатывает начальную часть кода (опрос системных параметров, чтение файла конфигурации, подготовка данных и т.п.), затем вызывает MessageBox с MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2 | MB_HELP, а MessageBox, ничего не рисуя, молча возвращает IDNO (No — кнопка по умолчанию). Код возврата, полученный от MessageBox, сразу же выводится в лог, никаких промежуточных присваиваний или условной обработки нет, так что нет сомнений, что код приходит от MessageBox.
Я такого ни разу не видел, и даже не слышал. Подозреваю, что у пользователя в обоих системах стоит какой-то софт, то ли перехватывающий MessageBox, то ли программно нажимающий кнопку, но пользователь уверяет, что регулярно запускает разные программы, в том числе установщики, и все работает нормально. Я тоже не вижу в своем коде ничего подозрительного, его запускают тысячи людей ежемесячно, никто не жаловался.
Может ли быть такое, чтобы MessageBox при каком-нибудь внутреннем исключении ничего не показывал, но возвращал не нуль, а код кнопки по умолчанию? Гуглеж находит только обсуждения, в которых MessageBox возвращал нуль, а вызывающий код не проверял возвращаемое значение.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Может ли быть такое, чтобы MessageBox при каком-нибудь внутреннем исключении ничего не показывал, но возвращал не нуль, а код кнопки по умолчанию? Гуглеж находит только обсуждения, в которых MessageBox возвращал нуль, а вызывающий код не проверял возвращаемое значение.
Может быть и не такое, у всяких моддеров, которые выключают всякие сервисы, ставят драйверы от 95й винды в десятку, отрезают виндовый шпионаж, освобождают память, запрещают обновления, и прочее тому подобное. Если это у тебя один такой клиент, я бы рекомендовал расстаться с ним. Если расстаться нельзя, или просто скучно, то начинать с того, что в safe mode перезагрузиться. Я один раз видел, как похожим образом глючит Unchecky (https://unchecky.com/). Оно там автоматически кнопки нажимает при инсталляциях, и не всегда хорошо понимает, на что именно нажимает.
Здравствуйте, Sharowarsheg, Вы писали:
S>Может быть и не такое, у всяких моддеров, которые выключают всякие сервисы, ставят драйверы от 95й винды в десятку, отрезают виндовый шпионаж, освобождают память, запрещают обновления, и прочее тому подобное. Если это у тебя один такой клиент, я бы рекомендовал расстаться с ним.
Клиент не производит впечатления фаната — в меру толковый пользователь, в целом понимает, как все устроено, но не спец.
S>Если расстаться нельзя, или просто скучно
Я ему ничем не обязан, он пока ничего не купил, но мне стало интересно, что за фигня такая вылезла.
S>начинать с того, что в safe mode перезагрузиться.
Это вариант, надо попробовать. Но тут может быть другая проблема — установщик ставит звуковой драйвер, а звук в Safe Mode зарезан, так что и там обломается.
S>Я один раз видел, как похожим образом глючит Unchecky (https://unchecky.com/). Оно там автоматически кнопки нажимает при инсталляциях, и не всегда хорошо понимает, на что именно нажимает.
Вот и я грешу на подобную автоматизацию, но клиент божится, что ничего подобного не держит, и малвари его антивирусники не находят.
ЕМ>Это вариант, надо попробовать. Но тут может быть другая проблема — установщик ставит звуковой драйвер, а звук в Safe Mode зарезан, так что и там обломается.
А она там раньше или позже обломается, чем message box? Если сначала MessageBox, то можно попробовать всё равно.
S>>Я один раз видел, как похожим образом глючит Unchecky (https://unchecky.com/). Оно там автоматически кнопки нажимает при инсталляциях, и не всегда хорошо понимает, на что именно нажимает.
ЕМ>Вот и я грешу на подобную автоматизацию, но клиент божится, что ничего подобного не держит, и малвари его антивирусники не находят.
Что ещё можно сделать, это конкретно для этого клиента сделать два одинаковых MessageBox. Или, время померять, и если оно меньше секунды, то выводить Message Box ещё раз, добавив к нему снизу строку Please wait at least three seconds before closing this message.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Может ли быть такое, чтобы MessageBox при каком-нибудь внутреннем исключении ничего не показывал, но возвращал не нуль, а код кнопки по умолчанию? Гуглеж находит только обсуждения, в которых MessageBox возвращал нуль, а вызывающий код не проверял возвращаемое значение.
Была такая хрень на Windows 7 embedded. Стандартные MessageBox вообще не показывались, а возвращали дефолтный результат (может быть даже IDNO) Решение
Оно?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Один из новых пользователей пожаловался, что мой установщик завершается, ничего не показав на экране, но заметил "какое-то моргание". Прислал логи установщика из двух систем — семерки и десятки. В обеих установщик нормально отрабатывает начальную часть кода (опрос системных параметров, чтение файла конфигурации, подготовка данных и т.п.), затем вызывает MessageBox с MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2 | MB_HELP, а MessageBox, ничего не рисуя, молча возвращает IDNO (No — кнопка по умолчанию). Код возврата, полученный от MessageBox, сразу же выводится в лог, никаких промежуточных присваиваний или условной обработки нет, так что нет сомнений, что код приходит от MessageBox.
ЕМ>Я такого ни разу не видел, и даже не слышал. Подозреваю, что у пользователя в обоих системах стоит какой-то софт, то ли перехватывающий MessageBox, то ли программно нажимающий кнопку, но пользователь уверяет, что регулярно запускает разные программы, в том числе установщики, и все работает нормально. Я тоже не вижу в своем коде ничего подозрительного, его запускают тысячи людей ежемесячно, никто не жаловался.
ЕМ>Может ли быть такое, чтобы MessageBox при каком-нибудь внутреннем исключении ничего не показывал, но возвращал не нуль, а код кнопки по умолчанию? Гуглеж находит только обсуждения, в которых MessageBox возвращал нуль, а вызывающий код не проверял возвращаемое значение.
Может, кто-то хук поставил ?
Как вариант — сделать простейшее приложение с таким же MessageBox и попросить пользователя запустить его и прислать лог.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Может ли быть такое, чтобы MessageBox при каком-нибудь внутреннем исключении ничего не показывал, но возвращал не нуль, а код кнопки по умолчанию? Гуглеж находит только обсуждения, в которых MessageBox возвращал нуль, а вызывающий код не проверял возвращаемое значение.
Можно попробовать выполнить все действия с клавиатуры, может с мышой что-то.
Еще был случай — винда выключалась внезапно. Подхожу, смотрю: вилка в розетке болтается!
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Может ли быть такое, чтобы MessageBox при каком-нибудь внутреннем исключении ничего не показывал, но возвращал не нуль, а код кнопки по умолчанию? Гуглеж находит только обсуждения, в которых MessageBox возвращал нуль, а вызывающий код не проверял возвращаемое значение.
Один коллега переустановил систему, чтобы избавиться от вируса, который странно влиял на поведение програм.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Я такого ни разу не видел, и даже не слышал. Подозреваю, что у пользователя в обоих системах стоит какой-то софт, то ли перехватывающий MessageBox, то ли программно нажимающий кнопку, но пользователь уверяет, что регулярно запускает разные программы, в том числе установщики, и все работает нормально.
Да просто все на Qt уже пишут с ручной отрисовкой кнопок и своими мессагебоксами.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, Doom100500, Вы писали:
D>Была такая хрень на Windows 7 embedded. Стандартные MessageBox вообще не показывались, а возвращали дефолтный результат (может быть даже IDNO) D>Решение D>Оно?
Блин, действительно оно. Спасибо! Эта хрень работает и в Win7 Pro, и в десятках.
Теперь осталось понять, как оно опознает приложение и/или стандартные диалоги. Ибо при включенном EnableDefaultReply, когда диалоги от моего установщика подавляются даже после переименования EXE, удаления оттуда информации о версии и модификации большинства строк, в тестовом приложении из нескольких строк, MessageBox не подавляется.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Как вариант — сделать простейшее приложение с таким же MessageBox и попросить пользователя запустить его и прислать лог.
Я уже в своей виртуалке поставил этот софт (Media Control Server от Autonomic Controls), и получил тот же эффект (подавление MessageBox) со своим установщиком, но простейшее приложение MessageBox показывает. После удаления Media Control Server проблема сохраняется. Выключение EnableDefaultReply в "Error Message Instrument" решает проблему, но очень хочется понять, каким образом винда различает установщик и тестовое приложение, чтобы в подавлять MessageBox в установщике, но не подавлять его в тестовом.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Я уже в своей виртуалке поставил этот софт (Media Control Server от Autonomic Controls), и получил тот же эффект (подавление MessageBox) со своим установщиком, но простейшее приложение MessageBox показывает. После удаления Media Control Server проблема сохраняется. Выключение EnableDefaultReply в "Error Message Instrument" решает проблему, но очень хочется понять, каким образом винда различает установщик и тестовое приложение, чтобы в подавлять MessageBox в установщике, но не подавлять его в тестовом.
Не объяснение, но установщик работает под elevated privileges. Попробуй сделать тестовое приложение с ними.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>установщик работает под elevated privileges. Попробуй сделать тестовое приложение с ними.
Еще до того, как сделать тестовое приложение, я выкинул из установщика манифест для повышения привилегий (там еще был список поддерживаемых версий винды и прочее) — ничего не изменилось.
По-моему, идея подавлять все MessageBox, и при этом только их, могла прийти в голову только очень больному человеку. И в Applications Log эти события пишутся только в том случае, когда включен EnableLogging.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>По-моему, идея подавлять все MessageBox, и при этом только их, могла прийти в голову только очень больному человеку. И в Applications Log эти события пишутся только в том случае, когда включен EnableLogging.
Вообще-то в инсталляторах полно DialogBox, и все они работают. MessageBox мало чем от их отличается, разве что в него вклиниться прямым путем нельзя.
Хотя черт его знает.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Вообще-то в инсталляторах полно DialogBox, и все они работают.
Ну так в статье есть оговорка, что не все диалоги с кнопками отображаются через MessageBox. Поэтому я и считаю эту идею предельно дурацкой. Подумал бы, что это чей-то костыль, сляпанный на коленке, если бы не достаточно развесистые параметры регистрации событий.
По уму, им надо было сделать фильтр по параметрам сообщений (заголовок, текст, конфигурация кнопок и т.п.). А этим дурным прибабахом куда проще выбесить и юзеров, и админов непонятным поведением системы/приложений, нежели добиться вменяемой автоматизации, для которой его придумали.
ЕМ>каким образом винда различает установщик и тестовое приложение, чтобы в подавлять MessageBox в установщике, но не подавлять его в тестовом.
Например по имени ехешника. Без шуток:
Installer Detection only applies to:
1. 32 bit executables
2. Applications without a requestedExecutionLevel
3. Interactive processes running as a Standard User with LUA enabled
Before a 32 bit process is created, the following attributes are checked to determine whether it is an installer:
Filename includes keywords like "install," "setup," "update," etc.
Keywords in the following Versioning Resource fields: Vendor, Company Name, Product Name, File Description, Original Filename, Internal Name, and Export Name.
Keywords in the side-by-side manifest embedded in the executable.
Keywords in specific StringTable entries linked in the executable.
Key attributes in the RC data linked in the executable.
Targeted sequences of bytes within the executable.
Здравствуйте, ononim, Вы писали:
O>Например по имени ехешника.
Это было первое, что я поменял. Потом выкинул манифест и VERSION_INFO — тоже не помогло. А в статье про Default Reply вообще ни слова об установщиках — там в первую очередь про сообщения об ошибках.
Сейчас интереса ради поменял в тестовом приложении абстрактный текст на "Install the application?", шапку — на "Application installer", вдобавок импортировал несколько функций из SetupAPI. Все равно этот MessageBox нормально отображается при включенном Default Reply. А установщик уже покорежил донельзя, и все равно ни один MessageBox оттуда не отображается. Реально, больные люди это делали.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Сейчас интереса ради поменял в тестовом приложении абстрактный текст на "Install the application?", шапку — на "Application installer", вдобавок импортировал несколько функций из SetupAPI. Все равно этот MessageBox нормально отображается при включенном Default Reply. А установщик уже покорежил донельзя, и все равно ни один MessageBox оттуда не отображается. Реально, больные люди это делали.
А что есть твой установщик? В смысле завязки на MSI есть или это просто приложение которое делает всё само?
PS: А так согласен, попахивает бредятиной. Вообще фича сама по себе попахивает.
Здравствуйте, Mystic Artifact, Вы писали:
MA> А что есть твой установщик? В смысле завязки на MSI есть или это просто приложение которое делает всё само?