Подтвердить что ты не робот

32-разрядная DLL "может несовместимо" на сервере 2008, но работает на сервере Server 2003

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

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

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

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

Что может случиться?

4b9b3361

Ответ 1

Версия 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 /n - не вызывать DllRegisterServer; эта опция должна использоваться с /i /s - Беззвучно; не отображаются окна сообщений (добавлены в Windows XP и Windows Vista) Когда вы используете Regsvr32.exe, он пытается загрузить компонент и вызвать его функцию DLLSelfRegister. Если эта попытка выполнена успешно, Regsvr32.exe отображает диалоговое окно с указанием успеха. Если попытка не удалась, Regsvr32.exe возвращает сообщение об ошибке. Это может включать код ошибки Win32. Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:  193625 Коды ошибок WinInet (от 12001 до 12156)

Ответ 2

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

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

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

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

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

Ответ 3

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

c:\windows\syswow64\regsvr32 yourdll.dll

btw это не сработает при вызове c:\windows\syswow64\regsvr32 c:\windows\syswow64\yourdll.dll

Ответ 4

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

CD\windows\syswow64 regsvr32 c:\filename. DLL

Ответ 5

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

Ответ 6

Используйте Process Monitor из SysInternals.

1. Фильтр по "Process Name" = regsvr32.exe. Filter

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

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

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

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

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

6. Ваша работа только начинается. Отныне.