Зарегистрировать файл DLL в Windows Server 2008 R2

Я пытаюсь зарегистрировать DLL-файл COM на Windows Server 2008 R2. Вот шаги, которые я предпринял:

  1. Запустите cmd от имени администратора
  2. c:\windows\system32\regsvr32.exe c:\tempdl\temp12.dll

Когда я выполняю эту команду, я получаю эту ошибку:

Модуль temp12.dll не удалось загрузить. Убедитесь, что двоичный файл хранится по указанному пути, или запустите его, чтобы проверить наличие проблем с двоичными или зависимыми .DLL файлами. Указанный модуль не может быть найден.

Я смог зарегистрировать тот же файл DLL в Windows 2000.

я тоже пробовал

c:\windows\syswow64\regsvr32 "c:\tempdl\temp12.dll"

И я получил эту ошибку:

модуль c:\tempdl\temp12.dll был загружен, но вызов DllRegisterServer завершился неудачно с кодом ошибки 0x80040154. Для получения дополнительных сведений об этой проблеме выполните поиск в Интернете, используя код ошибки в качестве условия поиска.


person Broken Link    schedule 28.12.2010    source источник
comment
Если вы хотите поместить все связанные библиотеки DLL в Dropbox, я буду рад исследовать это для вас.   -  person Kev    schedule 04.01.2011
comment
@kev спасибо за предложение, Кев. Но я исправил.   -  person Broken Link    schedule 07.01.2011


Ответы (8)


Это ошибка, которую вы получаете, когда сама DLL требует, чтобы сначала был зарегистрирован другой COM-сервер, или имеет зависимость от другой DLL, которая недоступна. Инструмент Regsvr32.exe делает очень мало, он вызывает LoadLibrary() для загрузки библиотеки DLL, которая передается в аргументе командной строки. Затем GetProcAddress() находит точку входа DllRegisterServer() в DLL. И вызывает его, чтобы предоставить COM-серверу возможность зарегистрироваться.

Что делает этот код, довольно сложно угадать. Однако полученная вами диагностика довольно очевидна из кода ошибки, по какой-то причине этому COM-серверу сначала нужно зарегистрировать еще один. Сообщение об ошибке дерьмовое, оно не говорит вам, какой другой сервер ему нужен. Печальный побочный эффект того, как работает обработка ошибок COM.

Чтобы устранить эту проблему, используйте инструмент SysInternals ProcMon. Он показывает, какие ключи реестра открывает Regsvr32.exe (фактически: COM-сервер), чтобы найти сервер. Ищите доступы к ключу CLSID. Это дает вам подсказку, что {guid} ищет. Это все еще не совсем говорит вам о серверной DLL, вы должны сравнить трассировку с той, которую вы получаете от работающей машины. Ключ InprocServer32 имеет путь к DLL.

person Hans Passant    schedule 05.01.2011
comment
Я обычный пользователь, пытающийся отлаживать программу, авторы которой мне не отвечают. Я скачал Process Monitor, но не знаю, как следовать вашему последнему абзацу. Можете ли вы объяснить мне, как решить эту проблему простым способом? - person Ooker; 23.02.2015

Возможно, вам потребуется зарегистрировать эту DLL, используя 32-разрядную версию regsvr32.exe:

c:\windows\syswow64\regsvr32 c:\tempdl\temp12.dll

person Kev    schedule 28.12.2010
comment
Я тоже пробовал это, и я получаю эту ошибку: модуль c:\tempdl\temp12.dll был загружен, но вызов DllRegisterServer завершился неудачно с кодом ошибки 0x80040154. Для получения дополнительных сведений об этой проблеме выполните поиск в Интернете, используя код ошибки в качестве условия поиска. - person Broken Link; 29.12.2010
comment
Вы делаете это из командной строки с повышенными разрешениями? - person vcsjones; 29.12.2010
comment
Да, у меня есть приведенный ниже сценарий в файле bat, и я запускаю его от имени администратора. Такой сценарий, поскольку cmd начинается с c:\windows\system32 cd.. cd syswow64 regsvr32 c:\tempdl\temp12.dll - person Broken Link; 29.12.2010
comment
У меня есть 12 dll для регистрации, и я могу зарегистрировать 3 из них указанным выше способом, для остальных ... это дает мне ошибку сбоя dllregisterserver. - person Broken Link; 29.12.2010
comment
Это ошибка, которую вы получаете, когда сама DLL требует, чтобы сначала был зарегистрирован другой COM-сервер. Невозможно угадать, что это может быть за DLL, вы можете использовать утилиту SysInternals ProcMon, чтобы увидеть, как она ищет ключ CLSID в реестре. Сравните со следом на рабочей машине. - person Hans Passant; 29.12.2010
comment
Возможно, запуск внутри Dependency Walker на работающей машине также может помочь отследить другую DLL. - person Ben Voigt; 04.01.2011
comment
RE сам ответ, по крайней мере, на Win7, regsvr32 достаточно умен, чтобы вызвать другую версию самого себя, если битность DLL не совпадает, поэтому вам не о чем беспокоиться. (Если это не отличается в других версиях ОС.) - person Leo Davidson; 04.01.2011
comment
@Leo - я знал это (это происходит в Windows 2008R2), но иногда никогда не знаешь :) - person Kev; 04.01.2011
comment
Я отдаю свой голос @Hans Passant - я понял, что использую процесс mon .. посмотрел на CLSID, и оказалось, что есть dll с именем MSJava.dll, и моя dll ищет его. Ганс... Можете ли вы перенести свой ответ в комментарии? Я хочу подарить тебе баллы. :) - person Broken Link; 06.01.2011

Ошибка 0x80040154 — это REGDB_E_CLASSNOTREG COM, что означает, что класс не зарегистрирован. По сути, класс COM не объявляется в реестре установки.

Если вы получаете эту ошибку при попытке зарегистрировать DLL, возможно, код регистрации для этой DLL пытается создать экземпляр другого COM-сервера (DLL или EXE), который отсутствует или не зарегистрирован на этом установка.

Если у вас нет доступа к исходному источнику DLL, я бы посоветовал использовать процесс SysInternal. Инструмент Monitor для отслеживания операций поиска в реестре COM (раньше был более простой инструмент RegMon, но он может больше не работать).

Вы должны поставить фильтр на рабочий процесс (здесь: Regsvr32.exe), чтобы захватить только то, что интересно. Затем вы должны искать запросы в HKEY_CLASSES_ROOT\[a progid, строка], которые не работают (с например, ошибка NAME_NOT_FOUND) или неудачные запросы к HKEY_CLASSES_ROOT\CLSID\[a guid].

PS: К сожалению, в отлично работающей системе Windows может быть много ошибок, поэтому вам придется внимательно изучить все ошибки. Удачи :-)

person Simon Mourier    schedule 04.01.2011

Я обнаружил аналогичную проблему при регистрации моего ActiveX (OCX) в Windows Server 2008 R2. Чтобы решить эту проблему, я использовал http://www.chestysoft.com/dllregsvr/default.asp tool. Существует некоторая проблема с зависимостью моего ocx, поэтому я получаю сообщение «Не удалось загрузить модуль temp12.dll. Убедитесь, что двоичный файл хранится по адресу указанный путь или запустите его, чтобы проверить наличие проблем с двоичными или зависимыми файлами .DLL. Указанный модуль не может быть найден» сообщение об ошибке. Когда вы пытаетесь зарегистрировать свой OCX с помощью этого инструмента, он предложит сообщение, если OCX имеет зависимость, или вы получите сообщение об успешном завершении. Я получил сообщение о зависимости mfc70.dll и msvcr70.dll. :\windows и готово. После этого я успешно зарегистрировал свой ocx. Я использовал 32-битную версию инструмента ChestySoft (dllregsvr.exe) на 64-битной машине Windows Server 2008 R2.

person nitin jain    schedule 01.10.2013

person TmTron    schedule 23.07.2012

Вам может потребоваться установить ATL, если ваши COM-объекты используют ATL, как описано в этой статье базы знаний:

http://support.microsoft.com/kb/201191

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

person vcsjones    schedule 28.12.2010
comment
У меня есть atl.dll в C:\Windows\SysWOW64\ и C:\Windows\System32, нужно ли мне делать то, что сказано в этой статье? - person Broken Link; 29.12.2010
comment
DLL, которые я пытаюсь зарегистрировать в 2008 году, были созданы в 2000 году, и я даже не знаю, есть ли у нас исходный код. - person Broken Link; 29.12.2010

Это то, что должно произойти.

Вам нужно скопировать DLL, которую вы хотите зарегистрировать, в: c:\windows\SysWOW64\

Затем в диалоговом окне «Выполнить» введите: C:\Windows\SysWOW64\regsvr32.exe c:\windows\system32\YourDLL.dll

и вы получите сообщение:

DllRegisterServer в c:\windows\system32\YourDLL.dll выполнен успешно.

person DevCompany    schedule 29.10.2012
comment
Это сработало для нас - у нас была dll в неправильной папке, когда мы поместили ее в SysWOW64, она зарегистрировалась без проблем. Спасибо! - person Vidar; 31.10.2012
comment
Это может сработать для вас, но вы не должны копировать свои собственные библиотеки DLL в системные папки. - person njplumridge; 02.09.2013

Вам нужен полный путь к regsvr32, поэтому %windir$\system32\regsvr32 ‹*.dll>

person Juls    schedule 02.06.2015