Регистрация 32-разрядной библиотеки DLL с 64-разрядным regsvr32
Учитывая следующее понимание
- 32-битный процесс не может загрузить 64-битную dll или наоборот.
- Для регистрации/отмена регистрации DLL
regsvr32
вызывает точку входа DllRegisterServer
/DllUnregisterServer
после загрузки целевой DLL в адресное пространство через LoadLIbrary
.
- В 64-битной системе 32-разрядная версия regsvr32 присутствует в
C:\Windows\SysWOW64
Но затем в моем ящике 2008 R2 я смог зарегистрировать 32-разрядную dll 64-битным regsvr32. Как это было возможно? Я что-то пропустил?
![enter image description here]()
Ответы
Ответ 1
Это должно объяснить, как именно это происходит:
![]()
(источник: alax.info)
regsvr32
запустит еще один битовый бит внутри, чтобы соответствовать битности DLL. Вот как регистрация проходит успешно. Вам не нужно заботиться о том, запускаете ли вы 32-битную или 64-битную версию regsvr32
, потому что она позаботится о несоответствии.
Сценарий, когда вам нужно позаботиться, - это когда вы запускаете regsvr32
из Visual Studio в качестве хоста отладки. Вам нужна правильная битность, потому что дочерний процесс с фактической регистрацией будет запускаться вне отладчика, и вы не сможете пошагово выполнить свой код.
Ответ 2
Кажется, Матс и мое предположение были правильными. MS повторно спроектировали 64-битный regsvr32, так что на основе целевой DLL-битности он может создать новый 32-разрядный процесс regsvr32 из% SYSWOW64% для регистрации DLL. Чтобы доказать этот момент, я активировал procexp, шпионил за всплывающим окном для 32-битной DLL, и вот что появилось.
Несколько замечаний
- Командная строка для 32-битных карт regsvr32 с 32-битным именем DLL, который я пытался зарегистрировать
- 32-разрядная версия regsvr32 является дочерним процессом 64-разрядной версии regsvr32
- Тип изображения и столбец пути
![enter image description here]()