Подтвердить что ты не робот

Windows 64-разрядный реестр v.s. 32-разрядный реестр

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

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

спасибо заранее, Джордж

4b9b3361

Ответ 1

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

Например, скажем, у вас есть приложение, в котором хранятся его данные реестра:

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX

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

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

НТН

Ответ 5

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

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

Ответ 6

Как зарегистрировать сборку .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" при использовании встроенного С++ для инициализации сборки .NET как COM-объекта.