64-битный реестр Windows v.s. 32-битный реестр - PullRequest
41 голосов
/ 15 мая 2009

Я слышал об архитектуре Windows x64, для поддержки запуска приложений x86 и x64 существует два отдельных / разных набора реестра Windows - один для доступа к приложению x86, а другой для доступа к приложению x64? Например, если COM регистрирует CLSID в наборе реестра x86, то приложение x64 никогда не сможет получить доступ к компоненту COM по CLSID, поскольку x86 / x64 имеют разные наборы реестра?

Итак, мой вопрос: верно ли мое понимание приведенного выше примера? Я также хочу получить еще несколько документов, чтобы изучить эту тему, о двух разных наборах реестра для архитектуры x64. (Я провел некоторый поиск, но не нашел никакой ценной информации.)

Ответы [ 6 ]

57 голосов
/ 15 мая 2009

Я столкнулся с этим вопросом не так давно. Короткий ответ: если вы запускаете 32-битное приложение на 64-битной машине, его ключи реестра находятся под Wow6432Node.

Например, предположим, у вас есть приложение, которое хранит информацию о реестре в:

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX

Если вы скомпилируете свое приложение как 64-битный двоичный файл и запустите его на 64-битном компьютере, то ключи реестра находятся в расположении выше. Однако, если вы скомпилируете свое приложение как 32-разрядный двоичный файл и запустите его на 64-разрядном компьютере, информация о реестре теперь находится здесь:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX

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

7 голосов
/ 15 мая 2009

Ваше понимание верно. Приложение x64 не будет нуждаться в доступе к CLSID x86, так как оно никогда не сможет загрузить эти компоненты, и наоборот.

Если вы хотите создать компонент для использования как x86, так и x64, то вам нужно либо создать пару dll, одну для x86, а другую для x64, и зарегистрировать обе в соответствующих частях реестра. Regsrv32.exe в папке System32 будет извращенно регистрировать компонент x64, а regsrv32.exe в папке SysWOW64 будет регистрировать компонент x86.

В качестве альтернативы создайте сборку .NET для любого процессора, который может использоваться любой архитектурой процессора.

4 голосов
/ 15 мая 2009

Это не отдельные реестры - один является подузлом другого, и ОС выполняет виртуализацию, чтобы гарантировать, что 32-битные приложения получают свои ключи, а 64-битные приложения получают свои ключи.

1 голос
/ 09 июня 2009

Как зарегистрировать сборку .NET для использования в качестве COM в чистом 64-битном приложении?

Проблема: По умолчанию, если вы включили «Регистрация для COM-взаимодействия» в настройках сборки, она НЕ регистрирует библиотеку типов для 64-разрядных.

Решение: Чтобы зарегистрировать вашу сборку, которой нет в GAC на 64-битной машине, откройте окно cmd и выполните:

cd c:\windows\microsoft.net\framework64\v2.x.xxxxx
regasm /codebase "path to your compiled assembly dll"

Это устранит ошибку «Class Not Registered Error» при использовании собственного C ++ для создания экземпляра .NET-сборки в качестве COM-объекта.

1 голос
/ 15 мая 2009

Вот статья Википедии о реестре WOW64, которая может дать вам некоторую информацию, которую вы ищете:

http://en.wikipedia.org/wiki/WOW64

1 голос
/ 15 мая 2009

Я использую 64-битную машину в качестве рабочего стола; и я никогда не сталкивался с какими-либо проблемами с различными конфигурациями реестра.

В MSDN, очевидно, есть разница: http://msdn.microsoft.com/en-us/library/ms724072(VS.85).aspx

НТН

...