32-разрядная библиотека DLL «может быть несовместима» на Server 2008, но работает на Server 2003 - PullRequest
20 голосов
/ 27 марта 2012

У нас есть проект, который компилируется в 32-битную COM DLL и в 64-битную COM DLL (тот же самый из моего предыдущего вопроса ). Когда я регистрирую оба на моем компьютере с Windows 7, оба регистрируются успешно. Когда я регистрирую оба на компьютере с Windows Server 2003, оба регистрируются успешно.

Но , когда я пытаюсь зарегистрировать библиотеки DLL на компьютере с Windows Server 2008 R2 Standard SP1, 64-разрядная библиотека DLL успешно регистрируется, но библиотека 32-разрядная не работает с сообщение (sic):

Модуль ""% 1 "" может быть несовместим с используемой версией Windows. Проверьте, совместим ли модуль с x86 (32-разрядной) или x64 (64-разрядной) версией regsvr32.exe.

Я не думаю, что 32-битная DLL может быть совместима с WS2003 и Win7, но не с WS2008. Это не имеет смысла.

Что может происходить?

Ответы [ 6 ]

14 голосов
/ 27 марта 2012

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

Вам может потребоваться явно вызвать 32-разрядную версию regsrv32, расположенную в% systemroot% \ SysWoW64 \ regsvr32.exe.

С http://support.microsoft.com/kb/249873

Regsvr32.exe входит в состав Microsoft Internet Explorer 3.0 или более поздних версий, Windows 95 OEM Service Release 2 (OSR2) или более поздних версий и Windows NT 4.0 с пакетом обновления 5(SP5) или более поздние версии.Regsvr32.exe устанавливается в папку System (Windows Me / Windows 98 / Windows 95) или System32 (Windows NT / Windows XP / Windows Vista / Windows 7).

Примечание. В 64-разрядной версииОперационная система Windows, существует две версии файла Regsv32.exe:

  • 64-разрядная версия -% systemroot% \ System32 \ regsvr32.exe.
  • 32-разряднаяверсия -% systemroot% \ SysWoW64 \ regsvr32.exe.

Использование Regsvr32.exe RegSvr32.exe имеет следующие параметры командной строки: Regsvr32 [/ u] [/ n] [/ i [: cmdline]] dllname

/ u- Отменить регистрацию сервера / i - вызвать DllInstall, передав ему необязательный [cmdline];при использовании с / u вызывает dll uninstall / n - не вызывать DllRegisterServer;эта опция должна использоваться с / i / s - Silent;не отображать окна сообщений (добавлено в Windows XP и Windows Vista) Когда вы используете Regsvr32.exe, он пытается загрузить компонент и вызвать его функцию DLLSelfRegister.Если эта попытка успешна, Regsvr32.exe отображает диалоговое окно, которое указывает на успех.Если попытка не удалась, Regsvr32.exe возвращает сообщение об ошибке.Это может включать код ошибки Win32.Для получения дополнительной информации щелкните следующий номер статьи базы знаний Майкрософт: 193625 Коды ошибок WinInet (с 12001 по 12156)

6 голосов
/ 26 августа 2013

Скорее всего, это не проблема в вашем случае, но может быть полезно для тех, кто находит этот вопрос, выполняя поиск по тому же сообщению об ошибке:

У меня была похожая проблема: DLL, которая не регистрировалась ни в 32-битной, ни в 64-битной версии RegSvr32. Я загрузил библиотеку DLL Walker Dependency Walker (зависимость.exe, http://www.dependencywalker.com/)) и получил гораздо более полезное сообщение:

Ошибка: хотя бы один файл не был 32-разрядным или 64-разрядным модулем Windows.

Сканирование столбца ЦП в списке модулей выявило неисправный модуль. (В моем случае было сказано: «Подпись DOS или PE не найдена. Этот файл не является допустимым 32-разрядным или 64-разрядным модулем Windows».)

Мораль: Dependency Walker может дать вам более полезное сообщение об ошибке, чем RegSvr32.exe.

3 голосов
/ 05 июня 2013

Я зарегистрировал его, переместив dll в каталог c: \ windows \ syswow64 \ (он не будет работать в каталоге system32), а затем явно вызвав syswow64 \ regsvr32, например

c: \ windows \ syswow64 \ regsvr32 yourdll.dll

кстати, это не будет работать при вызове c: \ windows \ syswow64 \ regsvr32 c: \ windows \ syswow64 \ yourdll.dll

1 голос
/ 22 сентября 2015

Запуск командной строки от имени администратора исправил мою проблему.

1 голос
/ 20 ноября 2013

У меня та же проблема, но я решаю ее с помощью команд

CD \ windows \ syswow64 regsvr32 c: \ filename. длл

0 голосов
/ 12 февраля 2014

Использование Process Monitor от SysInternals.

1. Фильтровать по «Имя процесса» = regsvr32.exe. Filter

2. Попробуйте зарегистрировать вашу dll из правильной версии regsvr32.exe (32-битная версия находится в папке SysWow64)

3. Монитор процессов будет отслеживать ВСЕ, что происходит на вашем компьютере.

4. Сначала запустите анализ, исключив события реестра (на данный момент) enter image description here

5. Вы можете увидеть, что ведьма найдена и не найдена.

Здесь (очень) частичный снимок экрана regsvr32.exe из Threed32.ocx, где мы можем увидеть некоторые из необходимых DLL enter image description here

6. Ваша работа только начинается. С этого момента.

...