Зарегистрировать файл DLL на Windows Server 2008 R2 - PullRequest
21 голосов
/ 29 декабря 2010

Я пытаюсь зарегистрировать файл COM DLL в 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.Для получения дополнительной информации об этой проблеме выполните поиск в Интернете, используя код ошибки в качестве условия поиска

Ответы [ 8 ]

26 голосов
/ 06 января 2011

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

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

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

5 голосов
/ 29 декабря 2010

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

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

4 голосов
/ 04 января 2011

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

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

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

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

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

1 голос
/ 01 октября 2013

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

1 голос
/ 23 июля 2012
0 голосов
/ 02 июня 2015

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

0 голосов
/ 29 октября 2012

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

Вы должны скопировать свою DLL, в которую хотите зарегистрироваться: C: \ Windows \ SysWOW64 \

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

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

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

0 голосов
/ 29 декабря 2010

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

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

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

...