Не удается получить доступ к 64-битным ключам реестра в этой версии Windows, как решить

Обновлено: 03.07.2024

Теперь, когда Office также устанавливается в 64-разрядной версии, где в реестре можно узнать, является ли установленная версия Office 32-разрядной или 64-разрядной?

28 ответов 28

  • Путь реестра: HKEY_LOCAL_MACHINE\Software\Microsoft\Office\14.0\Outlook
  • если вы установили Office 2013, используйте этот путь реестра: HKEY_LOCAL_MACHINE\Software\Microsoft\Office\15.0\Outlook
  • Раздел реестра: разрядность
  • Значение: x86 или x64.

и в других местах той же статьи:

  • Вы можете установить 32-разрядную версию Office 2010 и 32-разрядную версию Microsoft Outlook 2010 в поддерживаемой 32-разрядной или 64-разрядной версии операционной системы Windows. Вы можете установить 64-разрядную версию Office 2010 и 64-разрядную версию Outlook 2010 только в поддерживаемой 64-разрядной операционной системе.
  • Установка Office 2010 по умолчанию в 64-разрядной версии операционной системы Windows — это 32-разрядная версия Office 2010.
  • Разрядность установленной версии Outlook всегда совпадает с разрядностью Office 2010, если Office установлен на том же компьютере. То есть 32-разрядную версию Outlook 2010 нельзя установить на тот же компьютер, на котором уже установлены 64-разрядные версии других приложений Office 2010, например 64-разрядная версия Microsoft Word 2010 или 64-разрядная версия Microsoft Excel 2010. Аналогичным образом , 64-разрядную версию Outlook 2010 нельзя установить на тот же компьютер, на котором уже установлены 32-разрядные версии других приложений Office.

В моей тестовой среде этот раздел реестра Bitness отсутствует, если установка была выполнена с автономного установочного носителя Excel x64 (т. е. автономного EXCEL 2010). Предположительно, если в инсталляционном пакете есть Outlook, поле Bitness ставится, но если Outlook даже не вариант, вы не можете зависеть от этого ключа.

Кажется, не работает в версии 2016. Когда 32-разрядная версия Office установлена ​​на 64-разрядной машине, ключ HKEY_LOCAL_MACHINE\Software\Microsoft\Office\16.0\Outlook\Bitness не существует. Однако HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Office\16.0\Outlook\Bitness работает.

В интересах следующего бедолаги, который придет после меня, Битность — это не отдельный ключ, а Значение под основным ключом Outlook.

Просто примечание. Для запуска экземпляров по щелчку вы можете найти битовую версию в "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration\platform", где значение будет x86 или x64

Я проверил ответ Отаку, и оказалось, что значение разрядности Outlook установлено, даже если Outlook не установлен, хотя в упомянутой статье четко не указано, что это будет иметь место.

Отличная работа. Следует отметить, что на 64-разрядной машине значения разрядности существуют как в: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Outlook, так и в HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Outlook, что означает, что у вас нет беспокоиться о Wow64Redirection из 32-битного проекта установщика

При установке Office 2010 без Outlook. Судя по моим тестам, на 64-битной машине Win7 Bitness есть. В 32-битной системе WinXP Bitness отсутствует.

Я проверил настройки реестра, и у меня нет разрядности или какой-либо информации, связанной с Outlook. У меня установлен 64-разрядный пакет Office 2010, но не установлен Outlook.

На моем компьютере с минимальной настройкой Office 2010 (только Excel и VBA, без Outlook) значение Bitness можно найти только в ключе Wow6432Node.

Еще одно предупреждение: иногда ключ битности Wow6432Node отсутствует для 64-разрядной версии Outlook 2013 (15.0), согласно комментарию @JohnSblily. Это, видимо, ошибка Office. Кажется, это всегда имеет место для 64-разрядной версии Office 365, и я только один раз видел это для 64-разрядной версии, отличной от 365.

Чтобы добавить к ответу vtrz, вот функция, которую я написал для Inno Setup:

+1 Хотя вам следует использовать версию Unicode GetBinaryTypeW , см. также мой ответ на получение версии и платформы приложения Office из реестра Windows.

К сожалению, оба метода Otacku и @clatonh не работают для меня - ни Outlook Bitness, ни 1000-0000000FF1CE> в реестре (для 64-битного Office без установленного Outlook).

Единственный способ, который я нашел, не используя реестр, — это проверить разрядность одного из исполняемых файлов Office с помощью функции Windows API GetBinaryType (начиная с Windows 2000 Professional).

Например, вы можете проверить разрядность файла Winword.exe, путь которого хранится в разделе
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Winword.exe.

Вот фрагмент кода MFC:

Да, это то, что я начал делать в конце концов. Позор, как это вообще не круто, как обычай. настраиваемое действие в пакете установщика Windows. Проверка версии должна быть просто поиском по regpath. С установщиками Office365 дела IIRC стали еще более странными. там происходят взломы за взломами.

Я нашел способ проверить разрядность офиса.

Мы можем проверить разрядность Office 365 и 2016, используя этот раздел реестра:

Платформа x86 для 32-разрядной версии.

Платформа x64 для 64-разрядной версии.

Здесь мы используем GetBinaryType() в DLL, которую может вызывать любое приложение:

  • Если хост-приложение является 64-разрядным C/C++, GetBinaryType() возвращает SCS_32BIT_BINARY.
  • Если хост-приложение является 64-разрядным .NET (мы тестировали AnyCPU в 64-разрядной системе), GetBinaryType() возвращает SCS_64BIT_BINARY.

С точно таким же кодом DLL и точно таким же двоичным путем Outlook ("c:/Program Files (x86)/.") на том же компьютере.

Это означает, что вам может понадобиться протестировать двоичный файл самостоятельно, используя запись "IMAGE_NT_HEADERS.FileHeader.Machine".

Боже, я ненавижу неверные возвращаемые значения некоторых API Windows (см. также ложь GetVersion()).

Вы уверены, что не попадаете в виртуализацию реестра WOW64 из-за неправильной записи в манифесте приложения?

`GetBinaryType()' и виртуализация реестра? Я бы не ожидал, что это что-то изменит, особенно если путь указан точно, все равно EXE в другой разрядности в системе нет, так что это должно быть какое-то волшебство (красивое слово для этих пакостей винды), но не магия реестра.

Я нашел такой подход:

Если HKLM\Software\WOW6432Node существует, Windows является 64-разрядной.

Если HKLM\Software\WOW6432Node\Microsoft\Office существует, Office является 32-разрядным.

Если HKLM\Software\WOW6432Node\Microsoft\Office не существует, но существует HKLM\Software\Microsoft\Office, Office является 64-разрядным.

Если HKLM\Software\WOW6432Node не существует, Windows и Office являются 32-разрядными.

Примечание. Я столкнулся с проблемой на 32-разрядной машине, где существовал wow6432node, хотя ключ надстроек Outlook был единственным.

Я столкнулся с проблемой на 64-битной машине с x64-версией Outlook, но HKLM\Software\Wow6432Node\Microsoft\Office существует. Очевидно, что некоторые надстройки записывают свои ключи в оба узла.

Я не думаю, что это считается общим правилом, у меня нет HKLM\Software\WOW6432Node\Microsoft\Office , но мой Outlook 32-разрядный, я ясно вижу его в диспетчере задач ( OUTLOOK.EXE*32 ) .

Вот что мне удалось использовать в сценарии VB для обнаружения 64-разрядной версии Office Outlook:

Вы можете выполнить поиск в реестре по запросу 0000-0000000FF1CE>. Если цифры, выделенные жирным шрифтом, начинаются с 0, это x86, 1 – x64

Для меня это было в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Registration


От пользователя @Randolf в отдельном ответе ниже: «это путь реестра на моем ПК: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Registration <90140000-002A-0000-1000-0000000FF1CE>и это определенно 32-разрядная установка в 64-разрядной ОС."

Этот код InnoSetup работает для меня под Win 10x64 и Office 2016 x86 (используя «HKLM\SOFTWARE\Microsoft\Office\ClickToRun\Configuration» и ключ «Platform»)

EDIT: Решение без прикосновения к RegistryKeys - извините за операцию.

Я немного изменил его для своих нужд.

просто передайте правильный outlookPath в GetOutlookBitness()

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

У меня нет ключа bitness ни в одной из этих папок. У меня есть ключ с именем «по умолчанию» в обеих этих папках, и значение «не задано». Мой компьютер поставляется со стартером Office 2010 (я полагаю, 64-разрядный). Я удалил его и попытался выполнить полную установку 32-битного офиса. Я продолжаю получать следующее сообщение. файл несовместим, проверьте, нужна ли вам версия программы x86 или x64.

какой-нибудь совет для меня?

@clatonh: это путь к реестру на моем ПК: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Registration, и это определенно 32-разрядная установка в 64-разрядной ОС.

Вы уверены? Мой 32-битный Office 2007 на моей 64-битной Windows 7, ключ находится в HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\12.0\Registration\

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

Ранее я слепо следовал ответу, основанному на документах MSDN. Сегодня этого оказалось меньше, чем требовалось. На компьютере с установленным Office для дома и учебы, который не включает Outlook, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Outlook присутствовал, но HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Outlook не было. Теперь я изменил свой код, чтобы сначала найти «простую» версию, отличную от Wow6432Node. Если он присутствует, он будет использован. Если нет, он продолжит просмотр версии Wow6432Node. Это проверяется в установщике на основе Inno Setup — я не знаю, какие API использует Inno Setup. Если ваше приложение не обращается к реестру таким же образом, вы можете увидеть другие результаты.

Выполните поиск в реестре пути установки интересующего вас офисного компонента, например для Excel 2010 смотрите в ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ (Wow6432Node)\Microsoft\Office\14.0\Excel\InstallRoot. Это будет либо в 32-битном реестре, либо в 64-битном реестре, а не в обоих.

Не через реестр, а через инструменты командной строки:

Outlook.File.msg.15 /f "%1"

Путь по умолчанию можно изменить при установке. У вас может быть офис 32 или 64 бит под Windows 7, 8, 10 64-битная версия. Согласно документации, вы не можете иметь параллельную установку 32- и 64-битных систем на одном компьютере. Также обратите внимание, что другие приложения могут иметь ассоциацию .msg

Сначала я написал это для Outlook. Немного изменил его для Word, но он не будет работать в автономной установке, потому что этот ключ не показывает разрядность, только Outlook.

Кроме того, я написал его для поддержки только текущих версий Office =>2010

Я удалил все настройки и постобработку.

В моих тестах многие из описанных здесь подходов терпят неудачу, я думаю, потому, что они основаны на записях в реестре Windows, которые оказываются ненадежно присутствующими, в зависимости от версии Office, способа его установки и т. д. Таким образом, используется другой подход. вообще не использовать реестр (хорошо, так строго, что это не ответ на поставленный вопрос), а вместо этого написать скрипт, который:

  1. Создает экземпляр Excel
  2. Добавляет книгу в этот экземпляр Excel
  3. Добавляет модуль VBA в эту книгу.
  4. Внедряет небольшую функцию VBA, которая возвращает разрядность Office.
  5. Вызывает эту функцию
  6. Очищает

Вот этот подход реализован в VBScript:

ПС. Этот подход работает медленнее, чем другие здесь (около 2 секунд на моем ПК), но может оказаться более надежным для разных установок и версий Office.

По прошествии нескольких месяцев я понял, что может быть более простой подход, хотя и тот, который создает экземпляр Excel. VBScript:

Это основано на том факте, что Application.OperatingSystem при вызове из 32-разрядной версии Excel в 64-разрядной версии Windows возвращает Windows (32-разрядную) NT 10.00 или, по крайней мере, на моем ПК. Но это не упоминается в документах.


У меня 64-разрядная версия Win 7 + 32-разрядная версия Excel 2010. Реестр HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Registration

Таким образом, это может определить разрядность ОС, а не разрядность Office

В своем сценарии на основе InnoSetup я нашел безопасный и надежный способ определить, является ли конкретное приложение 32-разрядным или 64-разрядным (в моем случае мне нужно было протестировать Excel), используя функцию Win32 API. Эта функция называется GetBinaryType() , она исходит от `kernel32' (несмотря на название, она бывает 32- и 64-битной версии) и просматривает непосредственно заголовок исполняемого файла.

В 64-разрядных версиях Windows есть две папки для файлов приложений; папка «Program Files» содержит 64-разрядные программы, а папка «Program Files (x86)» содержит 32-разрядные программы.

Поэтому, если программа установлена ​​в папку C:\Program Files, это 64-разрядная версия. Если он установлен в C:\Program Files (x86), это 32-разрядная установка.

Я не советую этого делать, потому что похоже, что в последнее время Microsoft не следовала этому правилу. Если пользователь установил 32-разрядную версию Office на 64-разрядную машину через Office 365, 32-разрядная версия winword.exe устанавливается в «программные файлы» вместо «программные файлы (x86)». Например, установите 32-разрядную версию Office 2013 через портал Office 365. Вы получите путь к файлу winword.exe: C:\Program Files\Microsoft Office 15\root\office15 на 64-разрядной машине

Еще одна причина, по которой это может не работать, заключается в том, что пользователь может изменить папку установки практически на любую.

Еще один способ определить разрядность Office — узнать библиотеку типов.

Например, чтобы определить разрядность Outlook, напишите файл .JS следующим образом:

Вы можете узнать идентификатор typelib другого компонента Office и заменить для него первую строку функции. Вот краткий список интересных идентификаторов:

Все приведенные выше идентификаторы библиотек были найдены с помощью средства Windows SDK OLE-COM Object Viewer. С его помощью вы можете узнать больше идентификаторов библиотек.

Преимущество этого подхода заключается в том, что он работает для всех версий Office и обеспечивает контроль над каждым интересующим вас компонентом. Кроме того, эти ключи находятся в HKEY_CLASSES_ROOT и глубоко интегрированы в систему, поэтому маловероятно, что они были недоступны даже в изолированной среде.

Мне это не подходит. У меня определенно есть 64-разрядная установка Office 2010, однако ни один из ключей typelib, которые вы упомянули выше, не содержит ключевого пути «win64»; все они имеют путь win32. Я неправильно понимаю ваше решение?

Вам не нужно писать сценарий. Посмотрите на эту страницу, на которую я наткнулся:

Четвертое поле в productcode указывает разрядность продукта.

0 для x86, 1 для x64 0-1 (это также справедливо для MSOffice 2013)

Раздел реестра Outlook Bitness не существует на моем компьютере.

Один из способов определить разрядность Outlook – изучить сам Outlook.exe и определить, является ли он 32-разрядным или 64-разрядным.

В частности, вы можете проверить тип [IMAGE_FILE_HEADER.Machine][1], и это вернет значение, указывающее тип процессора.

Для отличного фона этого обсуждения при чтении PE-заголовка файла прочитайте это (устаревшая ссылка), в котором говорится;

Структура IMAGE_NT_HEADERS — это основное место, где хранятся особенности PE-файла. Его смещение задается полем e_lfanew в IMAGE_DOS_HEADER в начале файла. На самом деле существует две версии структуры IMAGE_NT_HEADER: одна для 32-битных исполняемых файлов, а другая для 64-битных версий. Различия настолько незначительны, что я буду считать их одинаковыми для целей этого обсуждения. Единственный правильный, одобренный корпорацией Майкрософт способ различения этих двух форматов — это значение поля Magic в IMAGE_OPTIONAL_HEADER (описано ниже).

IMAGE_NT_HEADER состоит из трех полей:

Поле Magic находится в начале структуры IMAGE_OPTIONAL_HEADER, 2 байта по смещению 24 от начала _IMAGE_NT_HEADERS. Он имеет значения 0x10B для 32-разрядных и 0x20B для 64-разрядных.

При распространении смешанного 32/64-разрядного пакета приложение, устанавливаемое пакетом, может использовать 32-разрядную или 64-разрядную версию одного и того же ключа реестра. В этом практическом руководстве пакет должен создать 32-разрядную или 64-разрядную версию раздела реестра HKEY_LOCAL_MACHINE\Software\MyKey.

Управление деревом на странице реестра не поддерживает повторяющиеся записи, но таблица «Реестр» внутри MSI поддерживает их. Таким образом, решение состоит в том, чтобы создать ключ, который использует свойство в своем имени. Вот шаги для ключа реестра HKEY_LOCAL_MACHINE\Software\MyKey (вы можете адаптировать пример к вашим собственным ключам реестра):

  1. Перейдите на страницу "Реестр" и создайте раздел реестра HKEY_LOCAL_MACHINE\Software\MyKey
  2. Добавьте в него свои 32-битные значения реестра
  3. Перейдите на страницу "Организация" и выберите функцию, содержащую значения реестра.
  4. Нажмите SHIFT+F4 на клавиатуре, чтобы просмотреть содержимое функции.
  5. Выберите компоненты 32-разрядных значений реестра, щелкните один из них правой кнопкой мыши и выберите меню "Свойства".
  6. В диалоговом окне «Редактировать свойства компонента» установите для поля «Условие» значение NOT VersionNT64.
  7. Перейдите на страницу свойств и создайте пользовательское свойство (например, MY_REG_KEY)
  8. Установите его значение равным имени вашего пользовательского раздела реестра ( MyKey )
  9. Перейдите на страницу "Реестр" и выберите родительский раздел вашего пользовательского раздела реестра ( HKEY_LOCAL_MACHINE\Software )
  10. Создайте под ним новый раздел реестра
  11. Переименуйте его в созданное вами пользовательское свойство ( [MY_REG_KEY] )
  12. Теперь у вас должны быть следующие ключи: HKEY_LOCAL_MACHINE\Software\MyKey и HKEY_LOCAL_MACHINE\Software\[MY_REG_KEY]
  13. Добавьте 64-битные значения реестра в ключ [MY_REG_KEY].
  14. Перейдите на страницу "Организация" и выберите функцию, которая их содержит.
  15. Нажмите SHIFT+F4 на клавиатуре и выберите компоненты 64-разрядных значений реестра.
  16. Нажмите правой кнопкой мыши на один из них и выберите меню "Свойства".
  17. В диалоговом окне «Редактировать свойства компонента» установите для поля «Условие» значение VersionNT64.
  18. Отметьте параметр "64-разрядный компонент".

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

  • MyValue для первого ключа
  • MyValue_1 для второго ключа

Если вы используете этот подход, пакет определит тип целевой системы (32/64-разрядная) с помощью свойства "VersionNT64". Кроме того, будут установлены только те компоненты, которые соответствуют типу системы.

Еженедельный веб-семинар с демонстрацией продукта Хотите принять участие в еженедельной демонстрации продукта? Выберите предпочтительный временной интервал.

Кто-нибудь может помочь? я пытался установить sims 4 [FitGirl Repack]
но каждый раз пишет "Внутренняя ошибка: не удается получить доступ к 64-битным ключам реестра в этой версии Windows."

Название модели: MacBook Air
Идентификатор модели: MacBookAir6,1
Название процессора: Intel Core i5
Частота процессора: 1,3 ГГц
Количество процессоров: 1
Общее количество ядер: 2
Кэш L2 (на ядро): 256 КБ
Кэш L3: 3 МБ
Память: 4 ГБ
Версия загрузочного ПЗУ: MBA61.0099.B21 < br />Версия SMC (система): 2.12f143

Intel HD Graphics 5000:

Модель набора микросхем: Intel HD Graphics 5000
Тип: GPU
Шина: встроенная
VRAM (динамическая, макс.): 1536 МБ
Производитель: Intel (0x8086) < br />Идентификатор устройства: 0x0a26
Идентификатор версии: 0x0009
Дисплеи:
Цветной ЖК-дисплей:
Тип дисплея: ЖК-дисплей
Разрешение: 1366 x 768
Пикс. Глубина: 32-битный цвет (ARGB8888)
Основной дисплей: Да
Зеркало: Выкл.
Онлайн: Да
Встроенный: Да

fixme:process:SetProcessDEPPolicy (1): заглушка
fixme:process:SetProcessDEPPolicy (1): заглушка
fixme:win:DisableProcessWindowsGhosting : заглушка
fixme:graphics:ShutdownBlockReasonDestroy (0x10086) : заглушка
fixme:graphics:ShutdownBlockReasonCreate (0x10086, L"Installing"): заглушка
fixme:msg:ChangeWindowMessageFilterEx 0x10094 c05b 1 0x0
fixme:msg:ChangeWindowMessageFilterEx 0x20094 c05b 1 0x0
fixme:win:WINNLSEnableIME hwnd 0x100a2 enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100a2 enable -1: заглушка!
fixme:graphics:ShutdownBlockReasonDestroy (0x10086): заглушка
fixme:graphics:ShutdownBlockReasonCreate (0x10086, L"Установка The Sims 4."): заглушка
fixme:msg:ChangeWindowMessageFilterEx 0x30094 c05b 1 0x0
fixme:msg:ChangeWindowMessageFilterEx 0x40094 c05b 1 0x0
fixme:msg:ChangeWindowMessageFilterEx 0x200a2 c05b 1 0x0
fixme:msg:ChangeWindowMessageFilterEx 0x300a2 c05b 1 0x0
fixmeSHAutoCompleter stub
:richedit:ReadColorTbl: неверная запись
err:richedit:ReadColorTbl: неверная запись
err:richedit:ReadColorTbl — неправильная запись
err:richedit:ReadColorTbl — неправильная запись
err:richedit:ReadColorTbl — неправильная запись
err:richedit:ReadColorTbl неправильно сформирована запись
err:richedit:ReadStyleSheet пропущена дополнительная цель
err:richedit:ReadStyleSheet пропущена дополнительная цель
err:richedit:ReadStyleSheet пропущена дополнительная цель
>err:richedit:ReadStyleSheet пропускает необязательное место назначения
err:richedit: Неправильный формат записи ReadColorTbl
err:richedit: Неверный формат записи ReadColorTbl
err:richedit: Неверный формат записи ReadColorTbl
err:richedit: Неправильный формат записи ReadColorTbl
err:richedit: Неверный формат записи ReadColorTbl
>err:richedit:ReadColorTbl неправильно сформирована запись
err:richedit:ReadStyleSheet пропущена дополнительная цель
err:richedit:ReadStyleSheet пропущена дополнительная цель
err:richedit:ReadStyleSheet пропущена дополнительная цель
err: richedit:ReadStyleSheet пропускает необязательное назначение
fixme:win:WINNLSEnableIME hwnd 0x100ea enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100ea enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100e0 enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100e0 enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100e0 enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100e0 enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x10100 enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x10100 enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x10102 enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x10102 enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100f6 enable 0: заглушка!
fixme:msg:ChangeWindowMessageFilterEx 0x10104 c05b 1 0x0
fixme:msg:ChangeWindowMessageFilterEx 0x20104 c05b 1 0x0
заглушка fixmeSHAutoComplete
fixme:win:WINNLSEnableIME hwnd 0x100f6 enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x10116 enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x10116 enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100f6 enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100f6 enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100fe enable 0: заглушка!
fixme:msg:ChangeWindowMessageFilterEx 0x30104 c05b 1 0x0
fixme:msg:ChangeWindowMessageFilterEx 0x40104 c05b 1 0x0
заглушка fixmeSHAutoComplete
fixme:win:WINNLSEnableIME hwnd 0x100fe enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x20118 enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x20118 enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100fe enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100fe enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100e0 enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100e0 enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100e0 enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100e0 enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x7011e enable 0: заглушка!
fixme:winsock:set_dont_fragment IP_DONTFRAGMENT для IPv4 не поддерживается на этой платформе
err:hid_report:process_hid_report Отчеты об устройствах поступают слишком быстро, последний отчет еще не прочитан!
err:hid_report:process_hid_report Отчеты об устройствах приходят слишком быстро, последний отчет еще не прочитан!
err:hid_report:process_hid_report Отчеты об устройствах приходят слишком быстро, последний отчет еще не прочитан!
err:hid_report:process_hid_report Отчеты об устройствах приходят слишком быстро, последний отчет еще не прочитан!
err:hid_report:process_hid_report Отчеты об устройствах приходят слишком быстро, последний отчет еще не прочитан!
fixme:win:WINNLSEnableIME hwnd 0x7011e enable -1: заглушка!
fixme:sfc:SfcIsFileProtected (0x0, L"C:\\Program Files\\The Sims 4\\unins000.exe") заглушка
err:hid_report:process_hid_report Отчеты устройств приходят слишком быстро, последние отчет еще не читал!
err:hid_report:process_hid_report Отчеты об устройствах приходят слишком быстро, последний отчет еще не прочитан!
err:hid_report:process_hid_report Отчеты об устройствах приходят слишком быстро, последний отчет еще не прочитан!
err:hid_report:process_hid_report Отчеты об устройствах приходят слишком быстро, последний отчет еще не прочитан!
fixme:win:WINNLSEnableIME hwnd 0x100e2 enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100e2 enable -1: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100e2 enable 0: заглушка!
fixme:win:WINNLSEnableIME hwnd 0x100e2 enable -1: заглушка!
fixme:graphics:ShutdownBlockReasonDestroy (0x10086): заглушка
wine: необработанная ошибка страницы при доступе на чтение к 0x01575514 по адресу 0x0000:0x01575514 (поток 0034), запуск отладчика.
err:hid_report:process_hid_report Отчеты об устройствах приходят слишком быстро, последний отчет еще не прочитан!
err:hid_report:process_hid_report Отчеты об устройствах приходят слишком быстро, последний отчет еще не прочитан!
err:hid_report:process_hid_report Отчеты об устройствах приходят слишком быстро, последний отчет еще не прочитан!
err:hid_report:process_hid_report Отчеты об устройствах приходят слишком быстро, последний отчет еще не прочитан!

Уровень 6

Gcenx Level 6
Сообщений: 654 Присоединился: Пн, 25 декабря 2017 г., 12:11

Редиректор реестра Windows на практике

Поскольку вы можете запускать как 32-разрядные, так и 64-разрядные приложения в Windows, могут быть случаи, когда у вас есть и 32-разрядные, и 64-разрядные версии одного и того же приложения на одном компьютере. Если это так, и у них разные настройки реестра, как Windows узнает, какие из них загружать? Здесь в игру вступает перенаправитель реестра Windows.

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

На практике это будет означать, что вызов SOFTWARE\Something\SomethingElse будет перенаправлен на Wow6432\SOFTWARE\Something\SomethingElse .

Чтобы просмотреть полный список затронутых разделов реестра, перейдите сюда.

Эффекты в дикой природе

Моя конкретная проблема заключалась в том, что мне понадобился установщик AdminUI, чтобы проверить, установлен ли AspNetCoreModuleV2 для информационных служб Интернета (IIS) на компьютере пользователя. Установщик, как часть нескольких других предварительных проверок, гарантирует, что соответствующее программное обеспечение установлено, просматривая подраздел «Удалить», который находится в SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ и Wow6432\SOFTWARE\Microsoft\Windows\CurrentVersion. \Удалить\

Я думал добавить модуль IIS в список ключей, которые программа уже проверяла. Я мог видеть на своей машине, что модуль IIS имеет запись реестра в ключе SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\. Однако, когда мой обновленный код запустился, он сообщил мне, что модуль отсутствует.

Это произошло потому, что я использовал следующий метод для открытия реестра: Registry.LocalMachine.OpenSubKey(path);

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

Несмотря на то, что описанный выше метод вызывается как с путями SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\, так и с путями Wow6432\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\, на самом деле код открывал только Wow6432\SOFTWARE\Microsoft\ Windows\CurrentVersion\Uninstall\ путь.

Вызов реестра для 64-разрядного представления (из-за того, что программа установки является 32-разрядным приложением) был перехвачен перенаправителем реестра Windows и перенаправлен на узел Wow6432.

Доступ к правильному представлению

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

Я изменил код доступа к реестру с: Registry.LocalMachine.OpenSubKey(path); в: RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey(путь);

Установщик AdminUI теперь правильно определяет наличие или отсутствие модуля IIS.

Заключение

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

Если вы хотите узнать больше об интерфейсе администратора или запросить демоверсию, свяжитесь с нашим отделом продаж.

Читайте также: