Не вдалося отримати заводський завод класу COM для компонента з CLSID {XXXX} через наступну помилку: 80040154


278

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

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

Я зареєстрував DLL за допомогою команди regsvr32. Я міг побачити цей CLSID в реєстрі. Але проблема зберігається.

У чому може бути проблема?


1
Веб-додаток, розміщений на тому ж сервері, здатний генерувати PDF-файл без будь-яких помилок.
gopal

Хлопці, я спробував усі можливі рішення, але все ж отримую цю помилку. Я маю збори і зареєстрував їх успішно, але все одно отримую ту ж помилку. Дійсно потрібна допомога ...
newprogress

Відповіді:


383

У VS - властивості проекту - на вкладці Build - ціль платформи = X86


7
у VS2008 я знайшов цю опцію в розділі "Компілювати-> Розширені параметри компіляції ..." (внизу вкладки вікна), а потім "Цільовий процесор" (x86)
Rodolfo

1
Ви заслуговуєте більше, ніж +1, але +1 - це все, що я маю дати
Девід

7
Це не завжди рішення.

2
Ти врятував мені сім офшорних банківських рахунків, хот-дог та мій шлюб. Дякую
Donald.Record

2
У мене те саме повідомлення про помилку, але це рішення не працює для мене.
Акрам-хан

59

Я зіткнувся з дуже схожим питанням.

Мені потрібно було використовувати стару 32-бітну DLL у веб-додатку, який розроблявся на 64-розрядній машині. Я зареєстрував 32-бітну DLL у папці Windows \ sysWOW64, використовуючи версію regsrv32 у цій папці.

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

Зміна пулу програм на "Увімкнути 32-бітні програми" вирішила проблему.


1
Це найпростіший спосіб я вирішити цю проблему. Дякую!
dexter

6
Я дуже люблю цю відповідь. Немає сенсу збирати весь веб-сайт для x86, коли ви в один момент викликаєте лише одну крихітну 32-бітну DLL.
DanM7

@Daniel Ballinger Чи мій додаток буде виконано як 32-бітний процес внесення змін?
Початковець

@Danny Я не вірю, тому що він не зможе отримати доступ до DLL, який я зареєстрував у sysWOW64.
Даніель Баллінгер

1
У мене така ж проблема, але я не знаю, як змінити пул додатків, де мені це зробити, plz допоможе мені
Shima.Y

58

Здається, ваша послуга побудована на основі "Будь-якого процесора", що спричинить помилки в 64-розрядному місці, де ви використовуєте компоненти COM. Вам потрібно побудувати його x86.

Веб-сайт, ймовірно, працює як 32-розрядний процес, тому він може використовувати компонент. Побудова рішення проти x86змусить вашу службу працювати як 32-розрядна.


Я також зіткнувся з тією ж проблемою. Там моя програма для настільних ПК встановлена ​​успішно в 64-бітній системі. Тим часом, коли я робив установку, я синхронізацію пройшов успішно, але коли я роблю синхронізацію зі свого програмного забезпечення, він показує мені вище помилку
Mohini Mhetre

Я намагаюся зареєструватися, .ocx file (c:\Windows\SysWow>RegSvr32 genX.ocx)але отримую помилку Модуль не вдалося завантажити. Переконайтеся, що двійковий файл зберігається у вказаному шляху або налагоджуйте його, щоб перевірити проблеми з бінарними або залежними .DLL файлами.
Naveen Kumar

І якщо вона складена як 32-розрядна, слід використовувати System regsvr32, а не версію SysWow64.
Fandango68

Я отримую цю помилку під час роботи пакета SSIS. З'єднання працюють нормально. Усі властивості правильні. Насправді пакет SSIS працював протягом багатьох місяців без жодних помилок. Раптом я отримую вище помилку. Я спробував змінити час виконання / налагодження на x86 з x64, проблема все ж не була вирішена.
IamVISH

16

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

  • Виберіть Пул програми
  • Виберіть пул, який використовує ваше додаток
  • Розширені налаштування
  • Увімкніть істинні 32-бітні програми

Це завжди було правдою для мене. Ніколи не доводилося встановлювати ціль платформи на X86, але завжди • Увімкнути 32-розрядні програми = Істинно • Встановити ідентичність = ApplicationPoolIdentity • Завантажити профіль користувача = True
Zath.

У мене була подібна проблема, яка була виправлена ​​відповідно до вказівок Nazim, але також повинна була не "Вставляти типи Interop" (властивість посилається на dll) і встановлювати Copy Local = true.
cymorg

Як "Вибрати пул додатків"?
CodyBugstein

Меню пулів додатків знаходиться у списку меню
iis

16

Якщо ви шукаєте спосіб зробити цю роботу без перекомпіляції будь-якої програми 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. Під щойно доданим вами новим ключем додайте нове значення String і називайте його DllSurrogate. Залиште значення порожнім.
  5. Створіть новий ключ під HKey_Local_Machine \ Software \ Classes \ AppID \ Знову новий ключ слід викликати таким же, як GUID об’єкта COM. Не потрібно додавати значення під цим ключем.

Я не беру на себе кредиту за рішення, але воно працювало на нас. Перевірте посилання на джерело для отримання додаткової інформації та інших коментарів.

Джерело: https://techtalk.gfi.com/32bit-object-64bit-environment/


1
Найкращі інструкції. Я використовував сторонній інструмент, що не міг змінити платформу збирання. Це рішення обійшло це питання. Дякую!

Я знайшов ключ, як ви описали на кроці 1, і тоді я знав, який об’єкт COM створює проблеми, тоді я просто запускаю regsvr32 на ньому. Дуже дякую!
MichaelS

Коли я це зробив, мій місцевий веб-сервер (IIS) почав отримувати відмову в доступі. Це говорить мені, що це був крок у правильному напрямку, але я не впевнений, кому надати доступ до цього моменту. stackoverflow.com/questions/14019401 / ...
user420667

14

Проблема полягає в тому, що серверний процес 64-бітний, а бібліотека - 32-бітна, і він намагається створити COM-компонент у тому ж процесі (вбудований сервер). Або перекомпілюйте сервер і зробіть його 32-бітним, або залиште сервер без змін і вимкніть компонент COM поза процесом. Найпростіший спосіб вивести COM-сервер поза процесом - створити додаток COM + - Панель управління -> Адміністративні інструменти -> ComponentServices.


Під час спроби створити програму COM + я зіткнулася з помилкою. An error occurred while processing the last operation. [Error code 00690075] The event log may contain additional troubleshooting information.
KZee

8

Я не змінив жодних параметрів компіляції.

Просто встановіть "Увімкнути 32-бітну програму = True" у додаткових налаштуваннях AppPool.

Це працювало для мене


1
Де додаткові налаштування AppPool?
CodyBugstein

7

Рішення для сервера Windows 2008 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)

Ця процедура дійсна, це нормально.


6

У мене було те саме питання, але інші відповіді дали лише одну частину рішення.

Рішення дворазове:

Видаліть 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-бітової реєстрації не вирішує мою проблему.


Бінго! Це відповідь, яку я шукав (дивіться мої коментарі в інших місцях). Дякую!
Fandango68

5

У вас була пов’язана проблема з іншим, але схожим виправленням:

У мене був проект служби Windows, встановлений на "Any-CPU", використовуючи 64-бітну DLL. Те саме повідомлення про помилку Перепробував цілу купу речей, але нічого не вийшло. Нарешті, я зайшов у проект Properties -> Build та помітив, що проект перевірив "Віддати перевагу 32-бітним". Якщо це не встановлено, більше помилок немає.

Я думаю, що служба Windows очікувала 32-бітну DLL, і не змогла її знайти.


Хоча це дивно, але це працює !! Дякую
FindOutIslamNow

3

Щоб змінити на x86:

  1. Створіть проект налаштування свого рішення.
  2. Після його створення перейдіть до Провідника рішень, клацніть правою кнопкою миші проект налаштування.
    • Натисніть Менеджер конфігурацій.
    • Клацніть на списку "Платформа активного рішення" та виберіть "Нове" (якщо x86 не відображається)
    • Виберіть один з комбінованих x86, потім натисніть кнопку OK.
    • відновити проект налаштування, а потім відновити весь проект.

3

Якщо ви працюєте з веб-сайтом, ви також можете спробувати встановити пул додатків для відключення 32-бітних додатків (за розширеними налаштуваннями пулу).


2
У мене було навпаки і довелося включати 32-бітні програми.
ряд1

2

В моєму особистому випадку проблему було вирішено за допомогою пошуку ідентифікатора класу в Реєстрі Windows на машині розробника (оскільки проблема була кинута в клієнтський ПК). Ця дія буде поміщена в компонент COM, який викликає проблему: бібліотека x86, на яку посилається мій проект .NET, яка не була зареєстрована як OCX / COM для програми встановлення або оновлення.

З повагою


1

Для всіх, хто використовує VSTO, проблема для мене була відсутнім посиланням на officeзбірку. Це також з’явиться, якщо ви намагалися інстанціювати певні об’єкти VSTO вручну.


1

Я виявив, що моя проблема пов'язана з фактичною реєстрацією DLL.

Спочатку запустіть "Regedit.exe" з підказки CMD (я підняв рівень безпеки до адміністратора, "на всякий випадок"), після чого пошукайте в Реєстрі (натиснувши "Редагувати / Знайти" в меню RegEdit або натиснувши Ctrl + F) для CLSID, що відображається у повідомленні про помилку, яке ви отримали стосовно фабрики COM-класу. Мій CLSID був 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. Коли цей ключ знайдений, виберіть підключення "InProcServer2" під цим вузлом Hive і встановіть ім'я файлу проблемної DLL у правій рамці Regedit. відображається в розділі "За замовчуванням". Якщо цей файл знаходиться у "C: \ Windows \ SysWow64" (наприклад, C: \ Windows \ SysWow64 \ Redemption.dll "), важливо, щоб ви використовували файл" C: \ Windows \ SysWow64 \ RegSvr32.exe "для зареєструйте цю DLL з командного рядка, а НЕ за замовчуванням "C: C: \ Windows \ SysWow64 \ RegSvr32.exe c: \ Windows \ SysWow64 \ Redemption.dll натисніть клавішу Enter. Закрийте вікно команд (через "Вийти", потім перезавантажте комп'ютер (завжди використовуйте перезавантаження замість "Закрити вниз", потім запустіть, оскільки (як не дивно) "Перезапуск" виконується ретельне вимкнення та перезавантаження всього, тоді як "Вимкнення" та "Power-Up" перезавантажується a зберігається кеш драйверів та інші значення (які можуть бути несправними). ​​Кожен раз, коли ви реєструєте DLL у майбутньому, не забудьте використовувати SysWow64 "RegSvr32.exe" для будь-якої DLL, що зберігається в папці C: \ Windows \ SysWow64, і ця проблема c (якщо вона викликана неправильною реєстрацією) не повинна повторюватися.


Прекрасна порада, але врахуйте, що при реєстрації 32-бітної DLL в SysWow64 тоді передбачається, що DLL має обгортку для обробки 64-бітових запитів.
Fandango68

0

Моя проблема полягала в тому, що в моєму посиланні на проект неправильна версія MS Sync FrameWork (1.0). Після оновлення до версії 2.1 помилка зникла і життя знову добре.


0

У моєму випадку я створюю MS Office файл на кшталт wordабо excel, запускаю Win+Rі виконую dcomcnfg, в конфігурації DCOM, крім того, вибираю пов'язаний елемент OFFICE (наприклад, ім'я містить Excelабо Wordабо Office), і Open the properties, select Identity tab and select the interactive user.як цю відповідь ,

Моє повідомлення про помилку показує CLSID {000209FF-0000-0000-C000-000000000046}, тому я повинен спробувати знайти цей конкретний CLSID у DCOM Config, і він робить виходи, і я вибираю його і виконую той же крок, що встановлений interactive user, тоді він працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.