Не удалось получить фабрику класса COM для компонента с CLSID {XXXX} из-за следующей ошибки: 80040154 - PullRequest
269 голосов
/ 24 июня 2009

Я разработал службу Windows, используя C # .NET для создания отчета в формате PDF. Для создания PDF-файла я использую стороннюю DLL. Приложение работает на моей платформе Windows XP. Когда я развернул службу в Windows Server 2008 64-битной версии, я получил эту ошибку:

Получение фабрики класса COM для компонент с CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6} не удалось из-за следующей ошибки: 80040154.

Я зарегистрировал DLL с помощью команды regsvr32. Я смог увидеть этот CLSID в реестре. Но проблема сохраняется.

В чем может быть проблема?

Ответы [ 17 ]

372 голосов
/ 23 мая 2010

В VS - свойства проекта - на вкладке Build - целевой объект = X86

58 голосов
/ 24 июня 2009

Похоже, что ваш сервис был построен на «Любой процессор», вызывая ошибки на 64-битной, где вы используете компоненты COM. Вам нужно построить его за x86.

Сайт, вероятно, работает как 32-битный процесс, поэтому он может использовать компонент. Построение вашего решения на основе x86 заставит ваш сервис работать как 32-битный.

55 голосов
/ 28 июля 2010

Я столкнулся с очень похожей проблемой.

Мне нужно было использовать старую 32-битную DLL в веб-приложении, которое разрабатывалось на 64-битной машине. Я зарегистрировал 32-битную DLL в папке windows \ sysWOW64, используя версию regsrv32 в этой папке.

Вызовы сторонней DLL работали из модульных тестов в Visual Studio, но не выполнялись веб-приложением, размещенным в IIS на той же машине, с ошибкой 80040154.

Изменение пула приложений на «Включить 32-разрядные приложения» решило проблему.

15 голосов
/ 13 января 2014

Вам не нужно настраивать целевой объект платформы свойств X86. Вы также можете настроить параметры iis для работы с x86 следующим образом

  • Выберите пул приложений
  • Выберите пул, который использует ваше приложение
  • Расширенные настройки
  • Включить 32-битные приложения true
14 голосов
/ 11 января 2013

Если вы ищете способ сделать эту работу без перекомпиляции приложения Any CPU, вот еще один потенциальный обходной путь:

  1. Найдите GUID вашего COM-объекта в HKey_Classes_Root \ Wow6432Node \ CLSID \ {GUID}
  2. После определения добавить новое значение REG_SZ (строка). Имя должно быть AppID, а данные должны совпадать с GUID COM-объекта, который вы только что искали
  3. Добавьте новый ключ в HKey_Classes_Root \ Wow6432Node \ AppID. Новый ключ должен называться так же, как GUID COM-объекта.
  4. Под новым ключом, который вы только что добавили, добавьте новое строковое значение и назовите его DllSurrogate. Оставьте значение пустым.
  5. Создайте новый ключ в HKey_Local_Machine \ Software \ Classes \ AppID \ Снова новый ключ должен называться так же, как GUID COM-объекта. Под этим ключом не нужно добавлять никаких значений.

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

Источник: https://techtalk.gfi.com/32bit-object-64bit-environment/

13 голосов
/ 24 июня 2009

Проблема заключается в том, что серверный процесс является 64-разрядным, а библиотека - 32-разрядной, и она пытается создать компонент COM в том же процессе (сервер in-proc). Либо вы перекомпилируете сервер и сделаете его 32-битным, либо оставите сервер без изменений и отключите COM-компонент. Самый простой способ сделать COM-сервер вне процесса - это создать приложение COM + - Панель управления -> Администрирование -> ComponentServices.

8 голосов
/ 20 октября 2014

Я не изменил никаких настроек компиляции.

Просто установите «Включить 32-битное приложение = True» в расширенных настройках AppPool.

у меня сработало

7 голосов
/ 13 апреля 2011

Решение для Windows 2008 Server x64:

  1. открыть cmd.exe с правами администратора.
  2. Скопируйте dll в папку C: \ Windows \ SysWOW64
  3. запустить regsvr32 из C: \ Windows \ SysWOW64
  4. Убедитесь, что dll находится в реестре Windows.
  5. Если у вас есть .exe x86, который использует dll, exe должен быть скомпилирован в режиме x86.
  6. EXE должен быть установлен в папку C: \ Program Files (x86)

Эта процедура действительна, она в порядке.

5 голосов
/ 26 июля 2014

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

Решение в два раза:

Удалите 64 бита из реестра.

  • c: \ windows \ system32 \ regsvr32.exe / U
  • Это не удалит ссылки на другие скопированные из dll в других папках.

или

  • Найдите ключ с именем HKEY_CLASSES_ROOT \ CLSID {......} \ InprocServer32. Этот ключ будет иметь имя файла DLL в качестве значения по умолчанию.
  • Я удалил папку HKEY_CLASSES_ROOT \ CLSID {......}.

Зарегистрируйте это как 32 бита:

  • C:\Windows\SysWOW64\regsvr32 <file.dll>

Регистрация в качестве 32-битной без удаления 64-битной регистрации не решает мою проблему.

5 голосов
/ 28 декабря 2012

Была проблема с другим, но похожим исправлением:

У меня был установлен проект службы Windows "Any-CPU" с использованием 64-битной DLL. То же сообщение об ошибке. Перепробовал кучу всего, но ничего не получалось. Наконец, я вошел в Свойства проекта -> Построить и заметил, что в проекте отмечен флажок «Предпочитать 32-битный». Снимите этот флажок и больше ошибок нет.

Я предполагаю, что служба Windows ожидала 32-битную DLL и не смогла найти ее.

...