Восстановление заводского сбоя класса COM. ошибка: 80040154 - PullRequest
3 голосов
/ 03 марта 2011

Получение фабрики классов COM для компонента с CLSID {AD37B7D5-B5A3-460A-8FFB-3C71984A4537} не удалось из-за следующей ошибки: 80040154.

Сведения об исключении:

System.Runtime.InteropServices.COMException: получение фабрики классов COM для компонента с CLSID {AD37B7D5-B5A3-460A-8FFB-3C71984A4537} не удалось из-за следующей ошибки: 80040154.

Я используюCOM DLL в моем веб-приложении ASP.NET.Мне удалось успешно заставить его работать как на моей собственной машине разработки, так и на сборочной машине.
Однако, когда я пытаюсь развернуть проект на другой машине (Microsoft Windows Server 2003 R2), я получаю вышеуказанную ошибку.

Я зарегистрировал COM DLL с помощью команды regsvr32.В нем говорится, что DLL была успешно зарегистрирована.

Я занимаюсь разработкой проекта в Visual Studio 2008 с ASP.NET версии 3.5 и собираю проект для работы на любом процессоре, каждая машина использует 64-разрядную версию Windows.Я использую IIS версии 6.0.
(я пытался включить IIS для запуска 32-разрядных приложений, это привело к недоступности веб-приложения.)

Я написал файл сценария Windows, чтобы проверить,COM DLL работала или не работала (т.е. не зависит от проекта).Этот скрипт отлично работал как на моей сборочной машине, так и на моей собственной машине разработки.
Однако он не работал должным образом на машине, с которой у меня возникли проблемы (Microsoft Windows Server 2003 R2).Мне нужно было запустить скрипт из командной строки, используя следующую команду (которую я нашел здесь ):

C:\WINDOWS\SysWOW64\wscript.exe COMtest.js  

Файл wscript успешно работает при таком запуске.
Я предполагаю, что это как-то связано с версией, для которой была создана COM DLL.

Нужно ли включать некоторые параметры в моем проекте Visual Studio?
(Обратите внимание, что я несобрал COM DLL сам. Кто-то другой собрал ее и дал мне.)

Ответы [ 3 ]

4 голосов
/ 03 марта 2011

Это ошибка FileNotFound COM. В этом случае очень вероятно, что это проблема разрядности. Реестр хранит регистрацию COM для 32-битных и 64-битных серверов отдельно. Сильно на это указывает его работоспособность при запуске wscript.exe из каталога syswow64, это дом для 32-битных исполняемых файлов. 64-разрядный процесс не сможет найти 32-разрядный сервер в реестре. И при этом это не будет в состоянии использовать это. Повторите это, запустив c: \ windows \ system32 \ wscript.exe

Сначала вам нужно будет собрать 64-разрядную версию COM-сервера, чтобы ее мог использовать 64-разрядный процесс. Затем вам нужно будет зарегистрировать его в 64-разрядной версии Regsvr32.exe, которая находится в каталоге c: \ windows \ system32, а не в syswow64. Если проблема не устранена, воспользуйтесь утилитой SysInterals ProcMon, чтобы выяснить, где находится процесс в реестре и файловой системе.

Или заставить IIS работать в 32-битном режиме. Это еще один вопрос, для которого нужны разные теги.

1 голос
/ 07 марта 2011

Я исправил эту проблему, создав приложение COM + для DLL.

0 голосов
/ 27 июня 2013

Я получил ошибку 80040154 при использовании стороннего DLL-файла.В конце концов я обнаружил, что ошибка была результатом попытки вызовов, которые были запрещены API - Visual Studio заставил меня думать, что они будут в порядке.Таким образом, один ответ может быть, чтобы проверить, что ваши вызовы API правильны с документацией dll, то есть RTFM!

Думаю, я бы добавил это, поскольку это может сэкономить кому-то ценное время.

...