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

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

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

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

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

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


14

Версия 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 Выпуск 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)

Поделиться
Улучшить этот ответ
отредактировано 26 марта ’12 в 20:51
ответил 26 марта ’12 в 20:45
  • 3
    64-разрядная версия regsvr32 может делегировать к 32-битной версии для (отмены) регистрации 32-битных библиотек DLL, и наоборот. Более вероятно, что WOW64 вообще не установлен. Начиная с Windows Server 2008 R2, WOW64 теперь является необязательным компонентом. — Реми Лебо, 26 марта 2012, 20:57
  • 4
    Мы уже пробовали использовать SysWOW64 regsvr32 для регистрации 32-битной DLL, и это вызывает ту же ошибку. — Нулевые указатели и т. Д. 28 мар. ’12 в 17:44
добавить комментарий |

Версия 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 Выпуск 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. Для получения дополнительных сведений щелкните следующий номер статьи в базе знаний Microsoft: коды ошибок 193625 WinInet (с 12001 по 12156)


6

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

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

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

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

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

Поделиться
Улучшить этот ответ
ответил 26 августа 2013 в 18:18
  • Это показало мне источник проблемы. Мой путь был таким, что загружалась 64-битная dll, а не 32-битная версия. — Armbie 06 июля ’17 в 22:54
добавить комментарий |

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

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

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

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

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


3

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

c: windows syswow64 regsvr32 yourdll.dll

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

Поделиться
Улучшить этот ответ
ответил 05 июня ’13 в 19:00
добавить комментарий |

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

c: windows syswow64 regsvr32 yourdll.dll

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


1

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

CD windows syswow64regsvr32 c: filename. dll

Поделиться
Улучшить этот ответ
ответ дан 20 ноя ’13 в 18: 35
добавить комментарий |

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

CD windows syswow64regsvr32 c: имя файла. dll


1

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

Поделиться
Улучшите этот ответ
ответил 22 сен. ’15 в 16:33
добавить комментарий |

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


1

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

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

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

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

4. Сначала начните анализ с исключения событий реестра (пока):

5. Вы можете увидеть, какой файл DLL найден, а какой нет.

Вот (очень) частичный снимок экрана regsvr32.exe из Threed32.ocx, где мы можем увидеть некоторые из необходимых файлов DLL:

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

Поделиться
Улучшите этот ответ
отредактировал 20 ноября ’19 в 13:33
01F0
1,08111 gold badge1919 серебряные знаки2929 бронзовых знаков
ответ дан
12 февраля 2014 в 22:14
добавить комментарий |

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

1. Фильтр по «названию процесса» = regsvr32.exe.

2. Попытайтесь зарегистрировать свой DLL-файл с помощью правильной версии regsvr32.exe (32-разрядная версия находится в папке SysWow64)

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

4. Сначала начните анализ, удалив события реестра (пока):

5. Вы можете увидеть, какой файл DLL найден, а какой нет. .

Вот (очень) частичный снимок экрана regsvr32.exe из Threed32. ocx, где мы можем увидеть некоторые из необходимых файлов DLL:

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

Оцените статью
Botgadget.ru
Добавить комментарий