powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Чтение из 64-битной ветки реестра при 32-битном запуске exe
14 сообщений из 14, страница 1 из 1
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843248
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например:
Код: vbnet
1.
2.
3.
   Dim App_ID As String = CType(My.Computer.Registry.GetValue _
     ("HKEY_CLASSES_ROOT\CLSID\{BA7C0D29-81CA-4901-B450-634E20BB8C34}", "AppID", ""), String)
    MsgBox(App_ID)



64-битный код прочитает:
Код: vbnet
1.
HKEY_CLASSES_ROOT\CLSID\{BA7C0D29-81CA-4901-B450-634E20BB8C34} "App_ID"


А 32-битный на x64 полезет сюда (и в зависимости от задачи будет неправ):
Код: vbnet
1.
HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{BA7C0D29-81CA-4901-B450-634E20BB8C34} "App_ID"



Как объяснить .Net что в Wow6432Node лезть не надо?

P.S. Требуемое поведение обеспечивается флагом KEY_WOW64_64KEY (это если через API)
Код: vbnet
1.
RegOpenKeyEx hKey, lpszSubKey, 0, 1 Or KEY_WOW64_64KEY, phkResult
...
Рейтинг: 0 / 0
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843324
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, по идее с помощью RegistryView :
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Imports Microsoft.Win32
...
Using baseKey As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry64)
	Using key = baseKey.OpenSubKey("CLSID\{BA7C0D29-81CA-4901-B450-634E20BB8C34}")
		Dim appId As String = key.GetValue("AppID", "")
	End Using
End Using
...
Рейтинг: 0 / 0
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843340
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

да я нашел этот способ

Есть проблема.
RegistryKey.OpenBaseKey отсутствует в .Net2
Есть еще:
RegistryKey.OpenRemoteBaseKey (имя машины "")
Было обрадовался, но в .Net2 именно нужного параметра то и нет опять.
(я все коды проверяю на совместимость с .Net2, не рискну пока закладываться на 4.5)

По идее мне нужно иметь 3 варианта функций:
1) default (т.е. как Any CPU запускается на данной машине, так пусть туда и кладет) -это если свои настройки
2) force x64 -это если я точно знаю, что речь идет о ветке родной для OS (если 64-битная os)
3) force x86 -это если я точно знаю, что ключ лежит в 32-битной ветке (создан другой 32-битной программой, если 64-битная OS)
...
Рейтинг: 0 / 0
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843366
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, получается API использовать для форсированных случаев (не так уж их у меня много, прописывать только все это опять придется). Причем допустимость запуска самого кода как 64-битного еще вынуждает добавлять KEY_WOW64_32KEY -вариант (доступ к 32-битному реестру).
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
  '------------------------------------------------------------
  'Get the value of the key
  '------------------------------------------------------------
  Public Function GetRegValue(ByVal hKey As IntPtr, ByVal lpszSubKey As String, _
   ByVal szKey As String, ByVal szDefault As String, _
   Optional ByVal reg64 As Boolean = False, Optional ByVal reg32 As Boolean = False) As String
    'reg64=true -> force 64-bit key
    'reg64=false + reg32=true  -> force 32-bit key
    'reg64=false + reg32=false  -> default key
    On Error GoTo ErrorRoutineErr

    Dim phkResult As IntPtr
    Dim lResult As Integer
    Dim szBuffer As String
    Dim lBuffSize As Integer

    'Open the key
    If reg64 Then
      RegOpenKeyEx(hKey, lpszSubKey, 0, 1 Or KEY_WOW64_64KEY, phkResult) 'force 64-bit key
    ElseIf reg32 Then
      RegOpenKeyEx(hKey, lpszSubKey, 0, 1 Or KEY_WOW64_32KEY, phkResult) 'force 32-bit key
    Else
      RegOpenKeyEx(hKey, lpszSubKey, 0, 1, phkResult) 'default key
    End If

    'Query lBuffSize
    lResult = RegQueryValueEx(phkResult, szKey, 0, , , lBuffSize)
    'Debug.Print("lResult=" & lResult & ";lBuffSize=" & lBuffSize)
    If lResult = ERROR_SUCCESS Then
      'Create buffer
      szBuffer = Space(lBuffSize)
      'Query the value
      lResult = RegQueryValueEx(phkResult, szKey, 0, , szBuffer, lBuffSize)
      'Debug.Print "lResult=" & lResult & ";lBuffSize=" & lBuffSize

      'Close the key
      RegCloseKey(phkResult)

      'Return obtained value
      If lResult = ERROR_SUCCESS Then
        GetRegValue = Strings.Left(szBuffer, lBuffSize / 2 - 1) 'делим на 2, т.к. Юникод и размер буфера в байтах
      Else
        GetRegValue = szDefault
      End If
    Else
      'Close the key
      RegCloseKey(phkResult)
      GetRegValue = szDefault
    End If
    Exit Function

ErrorRoutineErr:
    GetRegValue = ""
  End Function



Для дефолтного конечно My.Computer.Registry.GetValue вполне достаточно.
Net 2.0 вышел когда? В 2005? Видимо на этот момент данная проблема была не актуальна.
Поддержка добавлена только в .Net 4.0 (т.е. даже в 3.5 нету ).
Посему если хочу поддерживать XP- API без вариантов.
...
Рейтинг: 0 / 0
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843434
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

как кактус на вкус?
...
Рейтинг: 0 / 0
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843474
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилДмитрий77,

как кактус на вкус?Ты под кактусом что понимаешь?
.Net как таковой?
Или что?

Если сравнивать .Net с VB6 то у него гораздо больше внутренних возможностей (и что касается GUI, и что касается многих других оберток).
Но конечно я рассчитывал на большее, есть такое дело.

Что касается реестра, то VB6 вообще нормально его читать/писать не умеет. Кроме одной ветки, типа тупо предназначенной для VB-программ.
А здесь есть
My.Computer.Registry
Microsoft.Win32.RegistryKey
что для большинства задач более чем достаточно (без вникания в битность OS и битность кода).

И скорее всего я не рискну делать "Any CPU" или "x64" в первоначальном продакшн-варианте.
И не уверен насчет выбора Net2.0(3.5) или Net 4.5.
Но учитывать все эти ньюансы лучше сразу.
...
Рейтинг: 0 / 0
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843529
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ты под кактусом что понимаешь?
.Net как таковой?
Или что?
я уже не раз говорил - неудачный выбор инструмента, приводящий к повышеным затратам времени.
достаточно вынести весь код, требующий интенсивного использования WinAPI в dll, написанную на с++

способ взаимодействия - IDispatch (подойдёт для всего,хоть для Java)
...
Рейтинг: 0 / 0
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843539
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилдостаточно вынести весь код, требующий интенсивного использования WinAPI в dll, написанную на с++

способ взаимодействия - IDispatch (подойдёт для всего,хоть для Java)В нашем случае лучше C++/CLI.

зы: Необходимость установки vcredist бесит.
...
Рейтинг: 0 / 0
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843548
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кзы: Необходимость установки vcredist бесит.
если аккуратно собрать - рантайм статически приликуется

Алексей КВ нашем случае лучше C++/CLI.
втам тоже танец с бубном может потребоваться
...
Рейтинг: 0 / 0
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843557
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилДмитрий77Ты под кактусом что понимаешь?
.Net как таковой?
Или что?
я уже не раз говорил - неудачный выбор инструмента+1

Но может конечно игра стоит свеч, может она оплачивается большими деньгами :)
...
Рейтинг: 0 / 0
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843558
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И стоимость поддержки возрастает в разы. Так что ТС наверное деньги лопатой гребёт.
...
Рейтинг: 0 / 0
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843598
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей КВ нашем случае лучше C++/CLI.
втам тоже танец с бубном может потребоватьсяС IDispatch бубны, конечно же, не нужны. :-)
...
Рейтинг: 0 / 0
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843630
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КС IDispatch бубны, конечно же, не нужны. :-)
да не нужны
ну на старом фреймвоке из-за отсутсвия dynamic писанины чуть побольше
...
Рейтинг: 0 / 0
Чтение из 64-битной ветки реестра при 32-битном запуске exe
    #38843653
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей КС IDispatch бубны, конечно же, не нужны. :-)
да не нужны
ну на старом фреймвоке из-за отсутсвия dynamic писанины чуть побольшеНе верю в чудеса, надо будет как-нибудь попробовать. :-)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Чтение из 64-битной ветки реестра при 32-битном запуске exe
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]