Windows 64-разрядный реестр против 32-разрядного реестра
Я слышал о архитектуре Windows x64, чтобы поддерживать запуск приложения x86 и x64, есть два разных / разных набора реестра Windows: один для приложения x86 для доступа, а другой для приложения x64 для доступа? Например, если COM регистрирует CLSID в наборе реестра x86, то приложение x64 никогда не сможет получить доступ к COM-компоненту с помощью CLSID, потому что у x86 / x64 есть разные наборы реестра?
Итак, мой вопрос заключается в правильности моего понимания вышеприведенного образца? Я также хочу получить еще несколько документов, чтобы узнать эту тему, о двух разных наборах реестра для архитектуры x64. (Я сделал поиск, но не нашел никакой ценной информации.)
- Изменение режима округления с плавающей запятой
- Как получить доступ к массиву символов и изменить строчные буквы на верхний регистр, и наоборот
- В чем разница между MOV и LEA?
- Получение максимального значения в векторе __m128i с SSE?
- Что означают скобки в x86 asm?
- Как читать и писать регистры x86 флаги напрямую?
- Сборка, печать номер ascii
- Какая технология сопоставления кеша используется в процессоре Intel Core i7?
- Возможно ли, чтобы процессор x86 соответствовал процессору ARM с точки зрения производительности на ватт?
- Сборка скомпилированного исполняемого файла на Bash на Ubuntu в Windows не производит вывод
- Ссылка на содержимое ячейки памяти. (режимы адресации x86)
- Может ли современное оборудование x86 не хранить один байт в памяти?
- Почему оставить «mov esp, ebp» в сборке x86?
Я столкнулся с этим вопросом недавно. Короткий ответ заключается в том, что если вы запускаете 32-битное приложение на 64-битной машине, то это ключи реестра расположены под Wow6432Node.
Например, предположим, что у вас есть приложение, в котором хранятся данные реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX
Если вы скомпилируете свое приложение в виде 64-битного двоичного файла и запустите его на 64-битной машине, то ключи реестра находятся в указанном выше расположении. Однако, если вы скомпилируете свое приложение в виде 32-битного двоичного файла и запустите его на 64-битной машине, тогда данные реестра будут расположены здесь:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX
Это означает, что если вы запускаете 32-разрядную и 64-разрядную версии вашего приложения на одном компьютере, каждый из них будет искать другой набор ключей реестра.
Ваше понимание верное. Не было бы необходимости в приложении x64 для доступа к CLISID x86, поскольку он никогда не сможет загрузить эти компоненты в любом случае и наоборот.
Если вы хотите создать компонент для использования как x86, так и x64, вам нужно либо создать пару DLL, построенных для x86, а другую для x64 и зарегистрировать их в соответствующих частях реестра. Regsrv32.exe в папке System32 будет неправильно регистрировать компонент x64, а файл regsrv32.exe в папке SysWOW64 зарегистрирует компонент x86.
Альтернативно создайте сборку .NET для любого CPU, который может использоваться либо архитектурой процессора.
Они не являются отдельными реестрами – один является подназдой другого, а ОС выполняет виртуализацию, чтобы убедиться, что 32-разрядные приложения получают ключи и 64-битные приложения получают свои ключи.
Вот статья Википедии о реестре WOW64, которая может дать вам некоторую информацию, которую вы ищете:
Я запускаю x64-разрядную машину в качестве рабочего стола; и я никогда не сталкивался с проблемами с различными конфигурациями реестра.
По MSDN, по-видимому, существует разница: http://msdn.microsoft.com/en-us/library/ms724072(VS.85).aspx
НТН
Как зарегистрировать сборку .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-объекта.