Ошибка 0x80040154 класс не зарегистрирован

В этой статье я расскажу об исправлении одной очень распространенной ошибки Windows Installer. Обыскавши Интернет как русскоязычный, так и англоязычный, включая форумы и ньюсгруппы Microsoft, я понял что ошибка довольно распространенная, однако исправить ее, на самом деле никому не удавалось.

Суть проблемы

Как то одним жарким летним вечером я решил установить на свой компьютер ActeiveState ActivePerl. Скачал инсталлятор, который был в .msi файле и запустил его. Каково же было мое удивление, когда вместо привычного инсталлятора я увидел вот это:

Как вскоре оказалось, подобная ошибка выпадала при запуске на моем компьютере любого .msi файла.
Недолго думая, я полез в интернет, ввел в поиск появившееся сообщение, и, «О ужас!» — я увидел сотни постов людей с этой проблемой! В русскоязычном и англоязычном сегменте Интернета у множества людей была аналогичная проблема, и никто ее не смог решить по существу.
Наиболее распространенными советы по решению проблемы были

  1. Переустановить Windows Installer — на моей Windows 7 x64 и так стоит Windows Installer 5.0, который нельзя отдельно скачать и переустановить
  2. Перерегистрировать msiexec, что также мне не помогло.
  3. В конце все советы сводились к одному — переустановить 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.

У вас может быть аналогичная проблема, но при этом отсутствовать другой ключ реестра. Импортировать при этом необходимо те ключи, которых у вас нет.

Выводы

  1. В итоге я сэкономил себе массу времени — на поиск проблемы и ее устранение ушло не более двадцати минут, зато на переустановку всех программ на моем компьютере ушло бы минимум два дня.
  2. Не надо спешить переустанавливать Windows по любому чиху. Иногда проблему можно решить довольно просто и быстро.

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

Если у вас не включается синхронизация аккаунта Google на Андроиде, то можно забыть о такой удобной фишке, как доступ к контактам с любого устройства, имеющего доступ в интернет, или создании резервной копии данных.

Далее я рассмотрю причины отсутствия синхронизации аккаунта Android и Google, а так же ошибки, которые могут появиться при этом.

Внимание! Вы можете задать свой вопрос специалисту в конце статьи.

Причины сбоя синхронизации Google и Android

Если Android не с сервером Google, то искать причину следует прежде всего в работе мобильного устройства. Да, ошибки могут возникать на стороне Google, но это большая редкость. К тому же такие сбои моментально обнаруживаются и устраняются. Так что если Андроид отказывается синхронизировать контакты, почту, фотографии и другую информацию, выполните следующие действия:

  1. устройство.
  2. Проверьте стабильность интернет-соединения. Подключитесь к Wi-Fi, если есть такая возможность.
  3. Убедитесь, что синхронизация включена, параметры настроены правильно.
  4. и добавьте заново.

Читайте

Чтобы удалить учетную запись, зайдите в «Настройки» -> «Учетные записи» -> «Google» -> вызовите дополнительное меню (кнопка в виде трех кнопок справа сверху) и нажмите «Удалить».

Увеличить

При удалении учетной записи не пропадут никакие данные, так как сам аккаунт останется нетронутым. Перезагрузите смартфон, а при следующем включении добавьте профиль Google заново, указав логин и пароль.

Увеличить

Если проблемы с синхронизацией продолжают появляться, попробуйте добавить другой аккаунт Google. Если ни одна учетная запись не работает нормально, прошейте устройство. Рекомендуется устанавливать официальные прошивки, так как в различных кастомных сборках могут быть недостатки, которые и приводят к появлению различных сбоев в системе.

Включение синхронизации Google с Андроидом

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

  1. Зайдите в «Настройки».
  2. Откройте раздел «Аккаунты» («Личные данные», «Учетные записи»).
  3. Если внутри нет аккаунта Google, необходимо его добавить. Можно создать новую учетную запись или добавить данные существующего профиля Google – логин и пароль.
  4. Нажмите на добавленный аккаунт, чтобы открыть его параметры.
  5. Для включения синхронизации переведите переключатели возле нужных сервисов – контакты, Google Play Музыка, Google Fit, Google Фото и т.д.
  6. Чтобы запустить синхронизацию прямо сейчас, вызовите дополнительное меню и выберите в нем «Синхронизировать».

Увеличить

Читайте

По умолчанию синхронизируются данные приложений, календарь и контакты. Если вы хотите автоматически синхронизировать с сервером Google фото, то придется установить приложение Google Фото. В его настройках есть пункт «Автозагрузка и синхронизация» после активации которого фотографии будут отправляться на облачное хранилище.

Автоматическая синхронизация фото будет работать даже после удаления Google Фото. Чтобы отключить её, необходимо зайти в настройки приложения и передвинуть переключатель «Автозагрузка и синхронизация» в неактивное положение.

Увеличить

Дополнительные манипуляции понадобятся и для синхронизации почты из приложения Gmail. Чтобы данные отправлялись на сервер, нужно в настройках клиента поставить отметку «Синхронизация Gmail». Если синхронизация почты не работает, поможет очистка внутренней памяти телефона от лишних файлов (если хранилище переполнено) или удаление данных Gmail.