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. Это не имеет смысла.
Что может случиться?
Ответы
Ответ 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. Ваша работа только начинается. Отныне.