В этой статье я расскажу об исправлении одной очень распространенной ошибки 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) [22:08:06:894]: 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
[HKEY_CLASSES_ROOT\AppID\{000C101C-0000-0000-C000-000000000046}]
"ServiceParameters"=""
"LocalService"="MSIServer"
После импорта ключа реестра я вновь попробовал запустить .msi файл, и, «О чудо!», он запустился, после чего я успешно установил ActivePerl.
У вас может быть аналогичная проблема, но при этом отсутствовать другой ключ реестра. Импортировать при этом необходимо те ключи, которых у вас нет.
Выводы
- В итоге я сэкономил себе массу времени — на поиск проблемы и ее устранение ушло не более двадцати минут, зато на переустановку всех программ на моем компьютере ушло бы минимум два дня.
- Не надо спешить переустанавливать Windows по любому чиху. Иногда проблему можно решить довольно просто и быстро.
Спасибо за внимание, я очень надеюсь что статья вам понравилась, жду ваших отзывов, а также с удовольствием отвечу на ваши вопросы.
Ошибки: «Не удалось подключиться к другой программе: Класс не зарегистрирован» и «Процесс сервера не может быть запущен, так как указана неправильная идентификация» при синхронизации, выгрузках и внешних подключениях
Данное сообщение часто можно встретить при анализе журнала регистрации после неудавшейся синхронизации, когда настроено прямое подключение к программе.
1. -2147221164(0x80040154): Класс не зарегистрирован.
Данное сообщение говорит о том, что не зарегистрирована COM-компонента.
Для ее регистрации необходимо запустить командную строку с правами администратора и выполнить regsvr32 [ПутьДоКомпоненты].
После выполнения команды должно появиться сообщение об успешном выполнении регистрации библиотеки.
Однако, даже регистрация компоненты через командую строку “привычным” способом помогает не всегда. В таком случае, необходимо вручную создать COM-приложение.
Новому COM-приложению нужно ввести имя “V83COMConnector” и указать, что приложение является серверным.
Также необходимо обратить внимание, что учетной записью для работы приложения НЕ может быть встроенная учетная запись.
Чтобы избежать нежелательных ошибок, лучше выбрать “указанный пользователь” и указать там администратора.
После успешного создания V83COMConnector появится новое приложение.
Далее в созданном приложении необходимо установить новый компонент через контекстное меню.
Выбрать файл comcntr.dll в каталоге установленной платформы.
В следующем окне можно убедиться, что регистрация через командную строку была ложно-успешной, так как признак “Установлено” компоненты равен “Нет”.
После успешной установки, необходимо перейти к ветке V83COMConnector. В контекстном меню выбрать «Свойства». На вкладке “Безопасность” необходимо снять галку “Принудительная проверка доступа для приложений”. Установить галку «Применить политику программных ограничений» и выбрать уровень ограничений “Неограниченный”. Сохранить параметры.
На этом ручная установка приложения завершена.
2. Процесс сервера не может быть запущен, так как указана неправильная идентификация
Причинами этой ошибки могут быть:
- при ручной регистрации COM-компоненты либо была указана системная учетная запись, либо пользователь не имеющей прав администратора;
- служба сервера 1С запущена с локальной учетной записью.
Для изменения пользователя, от имени которого работает служба сервера 1С, необходимо открыть свойства службы, перейти на вкладку “Вход в систему” и указать пользователя с правами администратора.
После изменения учетной записи потребуется перезапуск службы.
Нужна помощь с 1С?
Мы можем взять на себя ваш бухгалтерский учет. Вам не нужно будет думать о расчете налогов и сдаче отчетности. Мы будем вести финансовую ответственность за ошибки. Мы — команда профессионалов, а не один бухгалтер, мы не заболеем, не пропадем и не уйдем внезапно в отпуск. Сосредоточьтесь на управлении. А учет и отчетность мы возьмем на себя. Чтобы получить бесплатную консультацию по автоматизации своего бизнеса Вы можете пообщаться с нашими специалистами в офисе компании или позвонив по телефону: 8-800-707-01-02.
Сопровождение 1С
Наш специалист
Специалист отдела сопровождения
Специалист-консультант по зарплатным решениям и 1С:Бухгалтерии
Чем мы можем быть вам полезны?
Ошибка 2147221164 0x80040154 класс не зарегистрирован 1C 8.3 Автор Олег (Системный администратор), Last modified by Олег (Системный администратор) на 23 октября 2019 10:41 до полудня |
При установке популярной программы бухгалтерского учёта «1С» (версии 8.3) или обновления программы с версии 8.2 на 8.3, а также запуска какой-либо соответствующей процедуры, юзер может получить сообщение «Ошибка 2147221164 0x80040154 класс не зарегистрирован», вызванное отсутствием регистрации класса. Данная ошибка может быть вызвана несоответствием версий 1С на сервере и клиентском ПК, а также отсутствием регистрации необходимого класса COMConnector (dll-библиотека comcntr.dll) в ОС Виндовс. В данном материале я расскажу о сути указанной дисфункции, а также поясню, как от неё избавиться. Особенности возникшей дисфункцииРазбираемая мной ошибка 2147221164 0x80040154 в 1C обычно связана с соединением баз данных по COM-объекту, и может иметь несколько причин:
Разберёмся со способами решения возникшей проблемы. Их два. Способ №1. Регистрируем необходимые библиотекиЕсли на ПК 32-битная ОС, то будет необходимо запустить командную строку с админ. правами, и там набрать: C:\Windows\System32\regsvr32 «C:\Program Files (x86)\1cv8\XXXXX\bin\comcntr.dll» Вместо XXXXX будет нужно ввести номер вашей версии 1С, к примеру, это может быть 8.3.10.2252 или иная (пройдите по указанному пути, и просмотрите номер установленной у вас версии). После этого регистрация упомянутого dll будет завершена, и «Ошибка 2147221164 0x80040154 класс не зарегистрирован» должна исчезнуть. Если на ПК 64-битная ОС, то данная строка должна выглядеть так: C:\Windows\SysWOW64\regsvr32 «C:\Program Files (x86)\1cv8\ХХХХХ\bin\comcntr.dll» Где ХХХХХ – номер вашей версии 1С Выполните следующее:
ЗаключениеИсправление проблем с незарегистрированными классами в 1С обычно решается с помощью двух способов, обозначенных мной выше. Наибольшую эффективность показал второй из перечисленных способов, потому рекомендую воспользоваться алгоритмом его реализации для исправления ошибки 2147221164 0x80040154 на вашем PC. |
(4 голос(а)) Эта статья полезна Эта статья бесполезна |
Проблема работы с COM объектом:-2147221164(0x80040154): Класс не зарегистрирован
☑
0
DGorgoN
10.12.15
✎
11:15
Для подключения 1с к весам поставщик дал свой ком компонент, зарегестрировал его как указанно в инструкции, ком объект не зарегестрировался толком, прописал вручную, но всё равно работать не хочет: http://firepic.org/?v=2.2015-12-10_jmqft48ui1ze.jpg
Код в 1с:
МойОбъект = Новый COMОбъект(«COMPtrLib.COMReceiver»);
Вес = МойОбъект.GetWeight(«COM1»);
Сообщить(Вес);
Выдает сразу:
{Форма.Форма.Форма(5)}: Ошибка при вызове конструктора (COMОбъект)
МойОбъект = Новый COMОбъект(«COMPtrLib.COMReceiver»);
по причине:
-2147221164(0x80040154): Класс не зарегистрирован
1
vde69
10.12.15
✎
11:17
ну ты или давай конкретику (какая винда, какой драйвер) или иди на сайт техподдержки оборудованияч
2
su_mai
10.12.15
✎
11:17
3
DGorgoN
10.12.15
✎
11:17
(1) Думаю не привязанно это к винде. Винда серверная 2012*64
4
DGorgoN
10.12.15
✎
11:21
regasm и gacutil делал. Прошло все без ошибок:
C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin> .\gacutil.exe /i «C:\Lib\COMPtrLib.dll»
PS C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin> cd «C:\Windows\WinSxS\amd64_regasm_b03f5f7f11d50a3a6.3.9600.16384
none_ea742672c514173d»
PS C:\Windows\WinSxS\amd64_regasm_b03f5f7f11d50a3a_6.3.9600.16384_none_ea742672c514173d> .\regasm /codebase /tlb «C:\Lib
\COMPtrLib.dll»
Microsoft (R) .NET Framework Assembly Registration Utility 2.0.50727.7905
Copyright (C) Microsoft Corporation 1998-2004. All rights reserved.
Types registered successfully
Assembly exported to ‘C:\Lib\COMPtrLib.tlb’, and the type library was registered successfully
PS C:\Windows\WinSxS\amd64_regasm_b03f5f7f11d50a3a_6.3.9600.16384_none_ea742672c514173d>
5
Барматолог
10.12.15
✎
11:23
(3) регал то как?
6
DGorgoN
10.12.15
✎
11:26
(5) Сначала командами
gacutil.exe /i «C:\Lib\COMPtrLib.dll»
regasm /codebase /tlb «C:\Lib\COMPtrLib.dll»
7
DGorgoN
10.12.15
✎
11:26
Потом уже ручками в ветках по скрину выше
8
DGorgoN
10.12.15
✎
11:26
9
vde69
10.12.15
✎
11:27
(3) это на 100% не относится к 1с, скорее всего компонента 32х а винда 64х
10
vde69
10.12.15
✎
11:28
у 1с есть доступ к каталогу «C:\Lib\COMPtrLib.dll» ???
по дефолту на сервере его не будет…
11
DGorgoN
10.12.15
✎
11:31
(10) 8.2 как бы
12
DGorgoN
10.12.15
✎
11:31
формы обычные
13
Барматолог
10.12.15
✎
11:31
(9) +0.5
(6) регай в Службе компонентов dcomcnfg
14
DGorgoN
10.12.15
✎
11:32
(9) ммм, а разница? и как побороть?
15
DGorgoN
10.12.15
✎
11:33
16
Барматолог
10.12.15
✎
11:33
сорри, не видел скрина (8)
17
DGorgoN
10.12.15
✎
11:33
Может имя как то неправильно или шаг какой то неправильно сделал
18
Барматолог
10.12.15
✎
11:33
(17) пользователь, вобщем, безопасность глянь еще
19
vde69
10.12.15
✎
11:36
(14)32х компонента не будет работать в 64х ОС, по крайне мере я не знаю способа кроме виртуальной 32х машины и подключение через DCOM+
20
DGorgoN
10.12.15
✎
11:36
(18) Прошу проконтролировать, а имя я правильно пишу? МойОбъект = Новый COMОбъект(«COMPtrLib.COMReceiver»);
21
Барматолог
10.12.15
✎
11:37
(20) правильно
22
Барматолог
10.12.15
✎
11:38
(19) пруфы?
23
DGorgoN
10.12.15
✎
11:39
(19) Она вроде с помощью нета написана, серьезно работать не будет?
24
vde69
10.12.15
✎
11:41
(22) пруфы на что? на несовместимость моделей адресации 32х и 64х ??? так это и ежу понятно, что короткий указатель не будет работать в адресном пространстве заточенном под длинные указатели.
25
Барматолог
10.12.15
✎
11:42
(24) но пишет же на то, что класс не зарегистрирован.
На несовместимость должен же писать другое.
26
Барматолог
10.12.15
✎
11:45
+(24) а как тогда работает COM для 1С 32 на 64 винде?
27
vde69
10.12.15
✎
11:45
(25)>>>> зарегестрировал его как указанно в инструкции, ком объект не зарегестрировался толком
так может ты приведешь описание ошибки при штатной регистрации ???
28
vde69
10.12.15
✎
11:46
(26) на 64х винде все библиотеки кома пересобраны на 64х
29
DGorgoN
10.12.15
✎
11:48
(27) Никаких ошибок не было. Написал что все ок, а в dcomcnfg не появился
30
ЧеловекДуши
10.12.15
✎
11:48
(26) Через одно место «ЖПУ». Большинство попросту не работает. Так что чудес не бывает
31
DGorgoN
10.12.15
✎
11:48
PS C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin> .\gacutil.exe /i «C:\Lib\COMPtrLib.dll»
Microsoft (R) .NET Global Assembly Cache Utility. Version 3.5.30729.1
Copyright (c) Microsoft Corporation. All rights reserved.
Assembly successfully added to the cache
32
DGorgoN
10.12.15
✎
11:49
PS C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin> cd «C:\Windows\WinSxS\amd64_regasm_b03f5f7f11d50a3a_6.3.9600.16384
none_ea742672c514173d»
PS C:\Windows\WinSxS\amd64_regasm_b03f5f7f11d50a3a_6.3.9600.16384_none_ea742672c514173d> .\regasm /codebase /tlb «C:\Li
\COMPtrLib.dll»
Microsoft (R) .NET Framework Assembly Registration Utility 2.0.50727.7905
Copyright (C) Microsoft Corporation 1998-2004. All rights reserved.
Types registered successfully
Assembly exported to ‘C:\Lib\COMPtrLib.tlb’, and the type library was registered successfully
33
ЧеловекДуши
10.12.15
✎
11:49
+(26) Не путай Клиентскую часть с Сервером 1С.
Клиент 1С, запускается под х32, т.к. у 1С нет приложения на х64.
А вот сервер есть на х64
34
vde69
10.12.15
✎
11:50
ну не знаю…
35
Барматолог
10.12.15
✎
11:50
(28) не совсем понял
Установили 1С 32 битную на 64 битную винду.
1) Регаем comcntr.dll
2) Через службы компонентов (dcomcnfg) создаем компонеент
36
DGorgoN
10.12.15
✎
11:52
(35) Ну я фактически через dcomcnfg и зарегал
37
Барматолог
10.12.15
✎
11:53
(36) с каким пользователем?
38
DGorgoN
10.12.15
✎
11:55
опа, теперь помутил, другое писать начал:
{Форма.Форма.Форма(5)}: Ошибка при вызове конструктора (COMОбъект)
МойОбъект = Новый COMОбъект(«COMPtrLib.COMReceiver»);
по причине:
-2147221005(0x800401F3): Недопустимая строка с указанием класса
39
ЧеловекДуши
10.12.15
✎
11:55
(35) Регаем на сервер 1С. На клиентской стороне твой ком-ок будет работать и без танцев бубном
40
ЧеловекДуши
10.12.15
✎
11:56
(38) Ты надеюсь это шаманство делаешь на Виртуальке, типо Виртуале Боксе, тестовой?
41
DGorgoN
10.12.15
✎
11:57
(40) Неа, только хардкор )
42
Барматолог
10.12.15
✎
11:58
(39) я спрашивал совершенно иное.
43
DGorgoN
10.12.15
✎
11:59
Опа, заработало
44
DGorgoN
10.12.15
✎
12:00
Какими то шаманскими действиями, сам не понял как. Удалил, заново пересобрал, заработало. Удивительно!
45
Барматолог
10.12.15
✎
12:00
vde69 пишет
>> (14) 32х компонента не будет работать в 64х ОС, по крайне мере я не знаю способа кроме виртуальной 32х машины и подключение через DCOM+
Я в (35), как тупой адинэсник, привожу пример работы 32 битной компоненты под 64 битным сервером
46
DGorgoN
10.12.15
✎
12:02
(45) Всё, как то само заработало. Причем в службе компонентов этот элемент не отобразился. Но работает. Как? не знаю. Но работает. Удивительно. Накачу сегодня за здоровье БиллаГейтса и СтиваБалмера
47
Барматолог
10.12.15
✎
12:07
(46) т.е. ты просто зарегал через resvr?
48
Барматолог
10.12.15
✎
12:08
* regsvr
49
Барматолог
10.12.15
✎
12:18
все, пошел накатывать?
50
DGorgoN
10.12.15
✎
12:32
(47) Пытался до этого но не канало. Сейчас просто ещё 1 раз выполнил все команды и заработало
14.08.2014, 23:59. Показов 6673. Ответов 1
Пишу приложение, работающее с FT232RL (это USB-UART мост, создающий виртуальный СОМ порт), использую стандартные библиотеки от FTDI. Помимо стандартных процедур отправки-приема данных, необходимо использовать функции аппаратного ключа доступа с ипользованием данной микросхемы — для этой цели фирма изготовитель микросхем предлагает готовую бесплатную библиотеку Там же есть готовый пример проекта.
Для запуска примера необходимо с помощью «regsvr32.exe» зарегистрировать библиотеку SafeGuard-IT.dll в системе (что я и сделал)
Все работает как надо, если я компилирую в режиме x86. Если же я создаю x64 сборку этого проекта (работаю в Windows7 x64), то как только программа доходит до выполнения кода с задействованием этой библиотеки (просто создания объекта класса) — получаю ошибку:
Исключение типа «System.Runtime.InteropServices.COMExcep tion» возникло в dispetcher.exe, но не было обработано в коде пользователя
Дополнительные сведения: Не удалось получить фабрику класса COM для компонента с CLSID {51ED4BE2-5DE8-4350-AB14-80CD71B65058} из-за следующей ошибки: 80040154 Класс не зарегистрирован (Исключение из HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
Пример кода, где возникает ошибка
C# | ||
|
Мне нужно создать приложение, которое бы работало как в х32, так и в х64 Windows. Сложность еще в том, что нужно использовать System.Data.SQLite.dll, а она не существует универсальной под любую разрядность.
Знаний у меня пока мало, поэтому подскажите:
1) Означает ли это, что библиотека позволяет создавать только x86 приложения, или есть все таки способ использовать ее в 64 битной сборке?
2) Возможно я неправильно зарегистрировал DLL с помощью «regsvr32.exe»?
3) Если нет никаких вариантов создания x64 приложения с библиотекой FTDI, то можно ли как то просто создать x86 приложение с применением System.Data.SQLite.dll, но чтобы оно работало в Windows x64 ?