2010-12-28 7 views
21

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

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

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

The module temp12.dll failed to load. Make sure the binary is stored at the specified path or debut it to check for problems with the binary or dependent .DLL files. The specified module could not be found.

Я был в состоянии зарегистрировать тот же DLL-файл на Windows   2000.

Я также попытался

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

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

the module c:\tempdl\temp12.dll was loaded but the call to DllRegisterServer failed with error code 0x80040154 . For more information about this problem, search online using the error code as the search term

+0

Если вы хотите, чтобы положить все связывал DLL файлы в Dropbox где-то я был бы счастлив, чтобы исследовать это для вас – Kev

+0

@ kev спасибо за предложение Kev. Но я исправился. –

ответ

26

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

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

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

+0

Я обычный пользователь, пытающийся отлаживать программу, которую ее авторы не отвечают мне. Я загружаю Process Monitor, но я не знаю, как следовать вашему последнему абзацу. Можете ли вы объяснить мне, как решить эту проблему простым способом? – Ooker

4

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

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

+1

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

+0

Выполняете ли вы это из командной строки с повышенными разрешениями? – vcsjones

+0

Да У меня есть следующий скрипт в файле bat и запускается как admin .. сценарий, как этот , поскольку ЦМД начинается в C: \ WINDOWS \ system32 кд .. кд Syswow64 regsvr32 "C: \ tempdl \ temp12.dll" –

0

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

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

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

+0

У меня есть atl.dll в C: \ Windows \ SysWOW64 \ и C: \ Windows \ System32, мне все еще нужно делать то, что они сказали в этой статье? –

+0

DLL, которые я пытаюсь зарегистрировать в 2008 году, был построен в 2000 году, и я даже не знаю, есть ли у нас исходный код. –

3

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

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

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

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

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

0

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

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

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

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

DllRegisterServer in c:\windows\system32\YourDLL.dll succeeded.

+0

Это сработало для нас - у нас была DLL в неправильной папке, когда мы поместили ее в SysWOW64, она не обнаружила никаких проблем. Благодаря! – Vidar

+1

Это может сработать для вас, но вы не должны копировать свои собственные библиотеки DLL в системные папки. – njplumridge

1

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

0

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