2009-05-15 3 views
37

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

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

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

ответ

52

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

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

HKEY_LOCAL_MACHINE\SOFTWARE\CompanyX 

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

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\CompanyX 

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

+2

Быстрый вопрос, если я использую regsvr32 для регистрации COM-компонента, как мы узнали, зарегистрированы ли мы в реестре x86 или x64? Мой ocnfusion, если он зарегистрирован в реестре x86, приложение x64 не сможет получить доступ к COM-компоненту? – George2

+7

Существуют две версии regsrv32 на 64-битной машине. Один зарегистрирует 64-битные двоичные файлы и один зарегистрирует 32-битные двоичные файлы в узле Wow6432. Эта статья Microsoft kb может быть вам полезна: http://support.microsoft.com/kb/282747 –

+0

1. Когда мы регистрируем новый COM-компонент с использованием 32-разрядного regsvr32, COM-компонент должен быть построен для x86 (когда мы зарегистрируйте новый COM-компонент с использованием 64-битного regsvr32, COM-компонент должен быть создан для x64) - означает, что мы не можем использовать 32-разрядный regsvr32 для регистрации 64-битного COM-компонента (или с использованием 64-разрядной regsvr32 для регистрации 32-разрядных COM-компонент), правильно? 2. 64-разрядный процесс может обрабатывать только х64-реестр для COM CLSID, а 32-разрядный процесс может обращаться только к реестру x86 для COM CLISD, без перекрестного доступа. Мое понимание правильно? – George2

1

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

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

+0

Предположим, что у меня есть .Net-приложение, построенное для любого процессора, и запустило его на x64, тогда оно должно быть JITed для доступа к реестру x64 - то есть CLSIDs COM, зарегистрированного в реестре x64, и если я зарегистрирую 32- бит COM-компонента, приложение .Net не сможет его найти? Мое понимание правильно? – George2

6

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

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

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

+0

@AnthonyWJones, меня интересует .Net. Любой выбранный вами образец процессора. Предположим, что у меня есть приложение .Net, созданное для любого процессора, и запустило его на x64, тогда оно должно быть JITed для доступа к x64-версии реестра - то есть CLSIDs COM, зарегистрированного в реестре x64? Мое понимание правильно? – George2

+1

В этом сценарии не JIT или .NET, который решает, какая часть реестра ищет CLSID, тот факт, что процесс, в котором выполняется код, составляет 64 бит, которые определяют, какой набор он будет использовать для поиска CLSID. Это происходит автоматически внутри библиотек поддержки COM, установленных в Windows. – AnthonyWJones

+0

1. Когда мы регистрируем новый COM-компонент с помощью regsvr32, регистрируем его в реестре x86 или в реестре x64 или под обоими? 2. Мое понимание заключается в том, что 64-разрядный процесс мог только перезаписать x64-реестр для COM CLSID, а 32-разрядный процесс мог получить доступ только к реестру x86 для COM CLISD, без перекрестного доступа. Мое понимание правильно? – George2

4

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

+0

Любые рекомендуемые чтения для новичков в этой теме? – George2

+1

Опубликованная выше статья MSND, вероятно, является лучшим местом для начала. http://msdn.microsoft.com/en-us/library/ms724072.aspx –

+0

Быстрый вопрос, если я использую regsvr32 для регистрации COM-компонента, как мы узнали, регистрируем ли мы COM-компонент под x86 или x64 реестр? Моя путаница, если она зарегистрирована в реестре x86, приложение x64 не сможет получить доступ к COM-компоненту? – George2

1

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

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

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

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

Это позволит устранить «Класс не зарегистрирован Error» при использовании родной C++ для инициализации сборки .NET как COM-объекта.

+0

Именно это привело к сбою моего приложения с 64-разрядным смешанным режимом - сборки были 32-битными com, зарегистрированными Visual Studio 2010. Поэтому вместо регистрации для COM-взаимодействия я поставил события пост-сборки в regasm, как указано выше (с/TLB в моем случае). Есть ли статья MSDN, связанная с этим поведением? – DaBozUK

Смежные вопросы