Содержание
В этой статье я расскажу об исправлении одной очень распространенной ошибки Windows Installer. Обыскавши Интернет как русскоязычный, так и англоязычный, включая форумы и ньюсгруппы Microsoft, я понял что ошибка довольно распространенная, однако исправить ее, на самом деле никому не удавалось.
Суть проблемы
Как то одним жарким летним вечером я решил установить на свой компьютер ActeiveState ActivePerl. Скачал инсталлятор, который был в .msi файле и запустил его. Каково же было мое удивление, когда вместо привычного инсталлятора я увидел вот это:
Как вскоре оказалось, подобная ошибка выпадала при запуске на моем компьютере любого .msi файла.
Недолго думая, я полез в интернет, ввел в поиск появившееся сообщение, и, «О ужас!» — я увидел сотни постов людей с этой проблемой! В русскоязычном и англоязычном сегменте Интернета у множества людей была аналогичная проблема, и никто ее не смог решить по существу.
Наиболее распространенными советы по решению проблемы были
- Переустановить Windows Installer — на моей Windows 7 x64 и так стоит Windows Installer 5.0, который нельзя отдельно скачать и переустановить
- Перерегистрировать msiexec, что также мне не помогло.
- В конце все советы сводились к одному — переустановить Windows.
Подумав о том, какое количество программ мне придется переустанавливать, а также о количестве потраченного на это дело времени, я решил пойти другим путем.
Решение проблемы
Для начала я включил Log-файл установщика Windows. Как включить лог Windows Installer вы можете почитать , или поискать в любом поисковике по ключевому слову «voicewarmup».
Лог-файлы появляются во временной папке пользователя, которая обычно находится по пути C:\Users\имя_профиля\AppData\Local\Temp. Открыв лог, я увидел следующую ошибку:
MSI (c) (B8:84) : Failed to connect to server. Error: 0x80040154
Поискав по коду ошибки в Интернете, и не нашедши никаких способов решения проблемы, я решил подумать логически.
Что означает ошибка 0x80040154? Поискав в поисковике, и воспользовавшись утилитой Error Lookup, я определил, что ошибка означает «Класс не зарегистрирован».
Обычно такая ошибка появляется, когда вы запрашиваете у системы создать COM-объект, который не был должным образом зарегистрирован в реестре. Но как определить какой именно объект не зарегистрирован?
Для начала я воспользовался старым добрым отладчиком WinDbg, который входит в пакет Debugging Tools For Windows. Мне понадобилась именно 64-разрядная версия данного отладчика.
Перед началом отладки необходимо загрузить отладочные символы для распознавания имен системных функций и переменных. Эти символы являются довольно полезной вещью не только для поиска ошибок, но также и для исследования работы Windows в целом.
Я предпочитаю указывать отладчику путь для поиска символов через переменную среды _NT_SYMBOL_PATH, которая должна быть задана как: C:\Symbols;srv*C:\Symbols*http://msdl.microsoft.com/download/symbols. В данном случае папка C:\Symbols — это хранилище загруженных символов на жестком диске, чтобы отладчик каждый раз не лез в интернет за ними.
Загрузил я в отладчик файл c:\windows\system32\msiexec.exe и задал для него параметры командной строки так, чтобы он открыл .msi файл. В моем случае параметром командной строки было: /i «C:\Users\MAV\Desktop\ActivePerl-5.12.4.1205-MSWin32-x64-294981.msi» однако можно задавать путь к любому другому .msi файлу.
Сам по себе отладчик, конечно не решит проблему, нужно ее локализовать. Поразмыслив, какие функции могут создавать COM-объекты, я остановился на CoCreateInstance, CoCreateInstanceEx и CoGetClassObject
Для установки точек прерывания на эти функции вводим в командной строке отладчика:
bp ole32!CoCreateInstance
bp ole32!CoCreateInstanceEx
bp ole32!CoGetClassObject
Если точки останова у вас не ставятся, значит вы неправильно настроили символы.
После запуска приложения (F5), срабатывает точка останова на ole32!CoCreateInstance. Если точка останова не срабатывает, а выпадает окно с параметрами Wndows Installer, то вы неправильно указали параметры командной строки для запуска.
Давайте теперь посмотрим, из какого же места кода вызывается создание нашего объекта, для этого мы можем нажать Debug->Step Out (Shift+F11). Мне пришлось нажать указанную комбинацию дважды, для того чтобы выйти в исходную вызывающую функцию.
Исходная вызывающая функция называется msi!CreateMsiServerProxy и, очевидно, находится в модуле msi.dll.
Обратим внимание также на регистр rax, который равен нашему коду ошибки 80040154. Для того чтобы узнать содержимое регистра rax, достаточно открыть окно Registers, или ввести в командной строке r rax.
Запомнив имя функции, а также примерный вид искомого кода, я открыл дизассемблер IDA Pro, и загрузил в него файл msi.dll. Следует отметить пару особенностей данного отладчика: во первых, IDA любит блокировать доступ к исследуемому файлу, во вторых, она создает в папке с исследуемым файлом несколько своих файлов баз данных, так что я рекомендую копировать исследуемые файлы в отдельную папку. В третьих, IDA не всегда подгружает файлы с символами, поэтому рекомендую в указанную отдельную папку также скопировать файл msi.pdb из вышеуказанной папки C:\Symbols.
После нахождения функции CreateMsiServerProxy, находим знакомые строки кода в ней:
Не иначе как функция пытается создать объект по CLSID IID_IMsiServer. Здесь я не буду вдаваться в подробности COM и искать различия между CLSID и IID, важно что я получил зацепку — имя интерфейса ID_IMsiServer и CLSID {000C101C-0000-0000-C000-000000000046}.
Запустив поиск в реестре на своей машине по указанным ключевым словам, а также на машине, с установленной Windows 7 x64, где Windows Installer работал, я нашел отличие: на моей машине отсутствовала ветка реестра HKEY_CLASSES_ROOT\AppID\{000C101C-0000-0000-C000-000000000046}. Я экспортировал данную ветку реестра в отдельный .reg файл, а затем импортировал его на своей машине:
Windows Registry Editor Version 5.00
«ServiceParameters»=»»
«LocalService»=»MSIServer»
После импорта ключа реестра я вновь попробовал запустить .msi файл, и, «О чудо!», он запустился, после чего я успешно установил ActivePerl.
У вас может быть аналогичная проблема, но при этом отсутствовать другой ключ реестра. Импортировать при этом необходимо те ключи, которых у вас нет.
Выводы
- В итоге я сэкономил себе массу времени — на поиск проблемы и ее устранение ушло не более двадцати минут, зато на переустановку всех программ на моем компьютере ушло бы минимум два дня.
- Не надо спешить переустанавливать Windows по любому чиху. Иногда проблему можно решить довольно просто и быстро.
Спасибо за внимание, я очень надеюсь что статья вам понравилась, жду ваших отзывов, а также с удовольствием отвечу на ваши вопросы.
Если у вас не включается синхронизация аккаунта Google на Андроиде, то можно забыть о такой удобной фишке, как доступ к контактам с любого устройства, имеющего доступ в интернет, или создании резервной копии данных.
Далее я рассмотрю причины отсутствия синхронизации аккаунта Android и Google, а так же ошибки, которые могут появиться при этом.
Внимание! Вы можете задать свой вопрос специалисту в конце статьи.
Причины сбоя синхронизации Google и Android
Если Android не с сервером Google, то искать причину следует прежде всего в работе мобильного устройства. Да, ошибки могут возникать на стороне Google, но это большая редкость. К тому же такие сбои моментально обнаруживаются и устраняются. Так что если Андроид отказывается синхронизировать контакты, почту, фотографии и другую информацию, выполните следующие действия:
- устройство.
- Проверьте стабильность интернет-соединения. Подключитесь к Wi-Fi, если есть такая возможность.
- Убедитесь, что синхронизация включена, параметры настроены правильно.
- и добавьте заново.
Читайте
Чтобы удалить учетную запись, зайдите в «Настройки» -> «Учетные записи» -> «Google» -> вызовите дополнительное меню (кнопка в виде трех кнопок справа сверху) и нажмите «Удалить».
При удалении учетной записи не пропадут никакие данные, так как сам аккаунт останется нетронутым. Перезагрузите смартфон, а при следующем включении добавьте профиль Google заново, указав логин и пароль.
Если проблемы с синхронизацией продолжают появляться, попробуйте добавить другой аккаунт Google. Если ни одна учетная запись не работает нормально, прошейте устройство. Рекомендуется устанавливать официальные прошивки, так как в различных кастомных сборках могут быть недостатки, которые и приводят к появлению различных сбоев в системе.
Включение синхронизации Google с Андроидом
Чтобы разобраться в параметрах синхронизации, для начала нужно знать, где включить эту функцию.
- Зайдите в «Настройки».
- Откройте раздел «Аккаунты» («Личные данные», «Учетные записи»).
- Если внутри нет аккаунта Google, необходимо его добавить. Можно создать новую учетную запись или добавить данные существующего профиля Google – логин и пароль.
- Нажмите на добавленный аккаунт, чтобы открыть его параметры.
- Для включения синхронизации переведите переключатели возле нужных сервисов – контакты, Google Play Музыка, Google Fit, Google Фото и т.д.
- Чтобы запустить синхронизацию прямо сейчас, вызовите дополнительное меню и выберите в нем «Синхронизировать».
Читайте
По умолчанию синхронизируются данные приложений, календарь и контакты. Если вы хотите автоматически синхронизировать с сервером Google фото, то придется установить приложение Google Фото. В его настройках есть пункт «Автозагрузка и синхронизация» после активации которого фотографии будут отправляться на облачное хранилище.
Автоматическая синхронизация фото будет работать даже после удаления Google Фото. Чтобы отключить её, необходимо зайти в настройки приложения и передвинуть переключатель «Автозагрузка и синхронизация» в неактивное положение.
Дополнительные манипуляции понадобятся и для синхронизации почты из приложения Gmail. Чтобы данные отправлялись на сервер, нужно в настройках клиента поставить отметку «Синхронизация Gmail». Если синхронизация почты не работает, поможет очистка внутренней памяти телефона от лишних файлов (если хранилище переполнено) или удаление данных Gmail.