powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / В реестр в Wow6432Node записать строку содержащую %ProgramFiles% без кавычек.
9 сообщений из 9, страница 1 из 1
В реестр в Wow6432Node записать строку содержащую %ProgramFiles% без кавычек.
    #39623970
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть функция, кот. пользуюсь без проблем и долго. (есть аналогичная для REG_EXPAND_SZ, но баг одинаковый)

Код: 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.
  Public Function SetRegValue(ByVal hKey As IntPtr, ByVal lpszSubKey As String, _
   ByVal sSetValue As String, _
   ByVal sValue As String, _
   Optional ByVal reg64 As Boolean = False, Optional ByVal reg32 As Boolean = False) As Boolean

    On Error GoTo ErrorRoutineErr

    Dim phkResult As IntPtr
    Dim lResult As Integer
    Dim SA As SECURITY_ATTRIBUTES
    Dim Create As Integer

    'Note: This function will create the key or
    'value if it doesn't exist.
    'Open or Create the key
    If reg64 Then
      RegCreateKeyEx(hKey, lpszSubKey, 0, vbNullString, _
       REG_OPTION_NON_VOLATILE, _
       KEY_ALL_ACCESS Or KEY_WOW64_64KEY, SA, phkResult, Create)
    ElseIf reg32 Then
      RegCreateKeyEx(hKey, lpszSubKey, 0, vbNullString, _
       REG_OPTION_NON_VOLATILE, _
       KEY_ALL_ACCESS Or KEY_WOW64_32KEY, SA, phkResult, Create)
    Else
      RegCreateKeyEx(hKey, lpszSubKey, 0, vbNullString, _
       REG_OPTION_NON_VOLATILE, _
       KEY_ALL_ACCESS, SA, phkResult, Create)
    End If

    lResult = RegSetValueEx(phkResult, sSetValue, 0, _
     REG_SZ, sValue, _
     (sValue.Length + 1) * 2)

    'Close the key
    RegCloseKey(phkResult)

    'Return SetRegValue Result
    SetRegValue = (lResult = ERROR_SUCCESS)
    Exit Function

ErrorRoutineErr:
    SetRegValue = False
  End Function



Основной смысл
reg64=true -> с флагом KEY_WOW64_64KEY (т.е. всегда будет 64-битное представление реестра)
reg32=true -> с флагом KEY_WOW64_32KEY (т.е. всегда будет 32-битное представление реестра, ветки Wow6432Node)

И понадобилось мне записать в 32-битное представление нечто типа %ProgramFiles%\Proga\proga.exe
причем именно так как написано
1) без кавычек
2) содержит слово %ProgramFiles% вот именно так как написано.

Естественно без вариантов reg32=true (KEY_WOW64_32KEY), иначе не туда запишет (либо без флагов если 32-бит App).

Он гад мне пишет
Код: vbnet
1.
%ProgramFiles(x86)%\Proga\proga.exe



Делаю тупой тест, просто в Current User (где редиректов нет вообще)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    SetRegValueExpandSZ(HKEY_CURRENT_USER, "Software\Test", "Test Value ExpandSZ 64", "%ProgramFiles%", True, False)
    '%ProgramFiles% 
    SetRegValue(HKEY_CURRENT_USER, "Software\Test", "Test Value SZ 64", "%ProgramFiles%", True, False)
    '%ProgramFiles% 
    SetRegValueExpandSZ(HKEY_CURRENT_USER, "Software\Test", "Test Value ExpandSZ 32", "%ProgramFiles%", False, True)
    '%ProgramFiles(x86)%
    SetRegValue(HKEY_CURRENT_USER, "Software\Test", "Test Value SZ 32", "%ProgramFiles%", False, True)
   '%ProgramFiles(x86)%
    SetRegValueExpandSZ(HKEY_CURRENT_USER, "Software\Test", "Test Value ExpandSZ NOFLAG", "%ProgramFiles%", False, False)
    '%ProgramFiles(x86)%
   SetRegValue(HKEY_CURRENT_USER, "Software\Test", "Test Value SZ NOFLAG", "%ProgramFiles%", False, False)
   '%ProgramFiles(x86)%


Я пока не могу понять какая именно автоматика так "гадит".
Понятно, что %ProgramFiles% и %ProgramFiles(x86)% это переменные среды, но моя задача просто записать строку в реестр (без умничаний).

Т.е. не поставишь KEY_WOW64_64KEY , будет искажать строчку
а поставишь, запишет не в ту ветку если ветка имеет 2 представления, а надо именно в 32-битную.

Как обойти?
...
Рейтинг: 0 / 0
В реестр в Wow6432Node записать строку содержащую %ProgramFiles% без кавычек.
    #39623971
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну конечно накуролесили они с этими редиректами, каждый раз узнаешь что-то новое:
Registry Redirector
редиректоры хреновыTo help 32-bit applications that write REG_SZ or REG_EXPAND_SZ data containing %ProgramFiles% or %commonprogramfiles% to the registry, WOW64 intercepts these write operations and replaces them with "%ProgramFiles(x86)%" and "%commonprogramfiles(x86)%". For example, if the Program Files directory is on the C drive, then "%ProgramFiles(x86)%" expands to "C:\Program Files (x86)". The replacement occurs only if the following conditions are met:
•The string must begin with %ProgramFiles% or %commonprogramfiles%. If the string begins with a space or any character other than %, it is not replaced.
•The case of %ProgramFiles% or %commonprogramfiles% must be exactly as shown because the string comparison is case-sensitive. For example, if the string begins with %CommonProgramFiles% instead of %commonprogramfiles%, it is not replaced.

Но обойти таки можно, хотя они же не рекомендуют явно указывать WOW6432Node, но других вариантов походу нет.
KEY_WOW64_64KEY отменит правило замены, а явное WOW6432Node таки ткнет в 32-битную ветку.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
    '[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\InprocServer32]
    If (sys_x64 = True) And (reg64 = False) Then 'мы на x64 OS и хотим писать в 32-битное представление
      'вместо этого мы пишем в 64-битном представлении, но явно указываем путь в WOW6432Node
      SetRegValue_ExpandSZ(HKEY_LOCAL_MACHINE, "SOFTWARE\WOW6432Node\Classes\CLSID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\InprocServer32", _
       "", "%ProgramFiles%\Proga\proga.dll", True, False)
    Else
      SetRegValue_ExpandSZ(HKEY_LOCAL_MACHINE, "SOFTWARE\Classes\CLSID\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\InprocServer32", _
       "", "%ProgramFiles%\Proga\proga.dll", reg64, reg32)
    End If



sys_x64 =True
...
Рейтинг: 0 / 0
В реестр в Wow6432Node записать строку содержащую %ProgramFiles% без кавычек.
    #39624305
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Страшно подумать, что будет при переходе на 128-битную версию
...
Рейтинг: 0 / 0
В реестр в Wow6432Node записать строку содержащую %ProgramFiles% без кавычек.
    #39624354
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,
что уже объявили о выходе x128?
Бардак там будет.

Как бы счас копался в куче OS в реестрах, от Win7 до 10 с оглядкой на висту, узнал много интересного.
1)Напр. в Висте многие ветки 32 и 64 менялись независимо, начиная с Win7 меняешь в 32, меняется в 64 и наоборот.
2) Другие ветки наоборот раньше зеркалились, а сейчас пишется только в 64
3) игрушки с переменными окружения, с чего тему начал, это нечто, это далеко не всегда надо, чтоб это навязывать
4) с Win8.0 появилась тенденция к ключам вида
REG_SZ
C:\Windows\System32\...
либо
REG_SZ
C:\Windows\SysWOW64\...
Может ли Windows >=8.0 быть установлен не на C: (отображаемая буква а не раздел)?
5) Из 32-бит App нереально поменять права/владельца (то бишь даклы и каклы если по простому) для 64-ветки, а вот мне напр. ну оч не хочется компилировать код в x64, хотя в целом я стараюсь писать 32/64 совместимый код/логику, но оч. редко делаю код 64, Any CPU не доверяю.
...
Рейтинг: 0 / 0
В реестр в Wow6432Node записать строку содержащую %ProgramFiles% без кавычек.
    #39624360
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,
>ну оч не хочется компилировать код в x64, хотя в целом я стараюсь писать 32/64 совместимый код/логику, но оч. редко делаю код 64,


Хочется-не хочется, а приходится
...
Рейтинг: 0 / 0
В реестр в Wow6432Node записать строку содержащую %ProgramFiles% без кавычек.
    #39624362
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лучше вообще ничего не писать в Program Files...
Для игрушек лучше что-то типа D:\Games, а для своих поделок C:\<Имя поделки_без_пробелов>\...
И проблем сразу поубавиться.
...
Рейтинг: 0 / 0
В реестр в Wow6432Node записать строку содержащую %ProgramFiles% без кавычек.
    #39624375
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
d7iЛучше вообще ничего не писать в Program Files...
Для игрушек лучше что-то типа D:\Games, а для своих поделок C:\<Имя поделки_без_пробелов>\...
И проблем сразу поубавиться.
а почему не "имя файла не более 8 букв"? )))
...
Рейтинг: 0 / 0
В реестр в Wow6432Node записать строку содержащую %ProgramFiles% без кавычек.
    #39624441
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Дмитрий77Cat2,
что уже объявили о выходе x128?
Бардак там будет.
Оси пока нет, но видеокарты уже есть.
...
Рейтинг: 0 / 0
В реестр в Wow6432Node записать строку содержащую %ProgramFiles% без кавычек.
    #39624451
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Дмитрий77Cat2,
что уже объявили о выходе x128?
Бардак там будет.
Оси пока нет, но видеокарты уже есть.

sizeof Int == 128?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / В реестр в Wow6432Node записать строку содержащую %ProgramFiles% без кавычек.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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