Регистрация 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