Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / x64 и опять неправильные пути, реестр на сей раз... / 5 сообщений из 5, страница 1 из 1
09.06.2009, 16:07
    #36033642
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x64 и опять неправильные пути, реестр на сей раз...
Вот добрался до Win2008 x64.
Для совместимости моей проги с Vista-образными системами для пары файлов надо устанавливать атрибуты "от имени администратора", а для одного даже "совместимость с...win98".
Как я это делаю:
инсталлятор пишет в реест ключи вида:

Код: plaintext
1.
2.
3.
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"[%InstallPath%]\\proga1.exe"="WIN98"
"[%InstallPath%]\\proga2.exe"="RUNASADMIN"
'......
На 32-битной висте/2008 сие работает на ура и дает требуемый эффект
На всех системах вида XP/2003/x86/x64 сие хотя в настоящий момент и пишется но абсолютно ни на что не влияет (лень было с-му в этом месте анализировать чтоб не писало).

А вот на 2008 x64 имеем бяку. Ключи ложатся не туда:
Код: plaintext
1.
2.
3.
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"G:\\Program Files (x86)\\Proga\\proga2.exe"="RUNASADMIN"
"G:\\Program Files (x86)\\Proga\\proga1.exe"="WIN98"
'.........
Нет, ну если умный вин знает чего куда класть...дай бог ему
Но при этом proga1.exe не знает что надо запускаться как win98, а proga2 не знает что она от имени админа. Соотв. при просмотре атрибутов из проводника их там тоже "отсутствует".
Ну и естественно если поместить "ручками" ключи куда и задумывалось, все будет корректно.

Какие будут идеи?
Использование функций базирующихся на
Код: plaintext
1.
2.
3.
4.
Declare Function RegSetValueEx Lib "advapi32" Alias _
    "RegSetValueExA" (ByVal hKey As Long, ByVal _
    lpValueName As String, ByVal Reserved As Long, _
    ByVal dwType As Long, ByVal szData As String, _
    ByVal cbData As Long) As Long
я пока не пробовал.
Но подозреваю что "злые винды" поступят здесь также как с инсталлятором.

Может есть API, которые именно устанавливают АТРИБУТЫ файлов, а не ключи реестра?
Или скажем какое волшебное командное штатное приложение в висте, типа icacl, например, очень бы помогло?
...
Рейтинг: 0 / 0
09.06.2009, 18:48
    #36034124
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x64 и опять неправильные пути, реестр на сей раз...
Не, чего то я не догоняю в этой жизни...
Если написать в командной строке (или в пуск-выполнить):

REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "G:\Program Files (x86)\Proga\proga1.exe" /t REG_SZ /d "WIN98" /f

все попадает куда надо.

Засовываю то же самое напр. в VB-код:
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub Command1_Click()
    Dim Str As String
    Str = "REG ADD " & Chr( 34 ) & "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" & _
        Chr( 34 ) & " /v  " & Chr( 34 ) & "G:\Program Files (x86)\FaxBoom\proga1.exe" & Chr( 34 ) & _
        " /t REG_SZ /d " & Chr( 34 ) & "WIN98" & Chr( 34 ) & " /f"
    Shell Str, vbNormalFocus
End Sub
и привет...
Вас приветствует Wow6432Node!!!
хоть от имени админа запускай, хоть от имени черта с рогами.

И даже не сомневаюсь что с апишками будет то же самое...
Или ему 64-битную прогу где-нибудь в DDK компилить надо чтобы сувал куда следует...
...
Рейтинг: 0 / 0
09.06.2009, 18:55
    #36034140
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x64 и опять неправильные пути, реестр на сей раз...
Дима, командная строка в Win64 это 64-х разрядное приложение и для него не происходит перенаправления, а VB6 это 32-х
разрядное приложение со всеми вытекающими :(


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
09.06.2009, 19:30
    #36034184
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x64 и опять неправильные пути, реестр на сей раз...
Да, вы правы безусловно.
Похоже я подобрался к истине, она уже где-то рядом:
Вот так работает как надо! /reg:64
The /reg:64 switch enables the source computer to receive the 64-bit view of the remote registry. Similarly, the /reg:32 switch enables the source computer to receive the 32-bit view of the remote registry. Этот ключ дает 32-битной проге работать как-бы от имени 64-х битной на предмет ковыряния в реестре...

Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub Command1_Click()
    Dim Str As String
    Str = "REG ADD " & Chr( 34 ) & "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" & _
        Chr( 34 ) & " /v  " & Chr( 34 ) & "G:\Program Files (x86)\Proga\proga1.exe" & Chr( 34 ) & _
        " /t REG_SZ /d " & Chr( 34 ) & "WIN98" & Chr( 34 ) & " /f /reg:64"
    Shell Str, vbNormalFocus
End Sub
http://kbalertz.com/948698/cannot-utility-access-registry-computer-computer-running-version-Windows-Server.aspx
В принципе этого уже достаточно.
Но если хотим через API что б уж совсем красиво:
Тогда читаем здесь
http://blog.not-a-kernel-guy.com/2007/05/07/181
Обращаем внимание на
KEY_WOW64_32KEY и KEY_WOW64_64KEY
Отсюда идем на Майкрософт
http://msdn.microsoft.com/en-us/library/aa384129.aspx
Видим названия знакомых в общем-то функций
Код: plaintext
1.
2.
3.
These flags can be specified in the samDesired parameter of the following registry functions:
RegCreateKeyEx 
RegDeleteKeyEx 
RegOpenKeyEx 
Дальше смотрим бейсиковские коды на тему этих ф-ций и ковыряемся.
И думаю, все должно получиться.

Ясно одно: инсталлятор с этой задачей за меня не справится, придется дописывать "утилиту разбора что ето за система такая".

reg.exe кстати это ж стандартная штука? Мож ее в коде и оставить? Или правильнее с API возиться?
...
Рейтинг: 0 / 0
10.06.2009, 02:49
    #36034532
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x64 и опять неправильные пути, реестр на сей раз...
Ну вот, потрудился слегка и родил через API.
В принципе можно было "reg64 As Boolean" и не добавлять, а просто забубенить
"Or KEY_WOW64_64KEY" ибо на 32-битках этот ключ все равно проигнорируется.
Так вроде культурнее...
А можно было и не париться а просто наляпать "reg.exe" + "/reg:64"
через Shell..,vbhide
В принципе это и через инсталлятор бы прокатило как "выполнить команду".
Но... надо же иногда и окультуриваться, а то так можно и забыть как проги пишутся...

Код: plaintext
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.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
'Registry Constants
Public Const HKEY_LOCAL_MACHINE = &H80000002
'...
'Registry Specific Access Rights
'...
Public Const KEY_ALL_ACCESS = &H3F
'новые ключи для доступа к 64-х битному реестру!
Public Const KEY_WOW64_64KEY = &H100
Public Const KEY_WOW64_32KEY = &H200
...

Public Function SetRegValue(hKey As Long, lpszSubKey As String, _
                    ByVal sSetValue As String, _
                    ByVal sValue As String, reg64 As Boolean) As Boolean

    On Error GoTo ErrorRoutineErr:

    Dim phkResult As Long
    Dim lResult As Long
    Dim SA As SECURITY_ATTRIBUTES
    Dim Create As Long

    '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 , "", _
            REG_OPTION_NON_VOLATILE, _
             KEY_ALL_ACCESS Or KEY_WOW64_64KEY, SA, phkResult, Create
    Else
        RegCreateKeyEx hKey, lpszSubKey,  0 , "", _
            REG_OPTION_NON_VOLATILE, _
            KEY_ALL_ACCESS, SA, phkResult, Create
    End If

    lResult = RegSetValueEx(phkResult, sSetValue,  0 , _
        REG_SZ, sValue, _
        CLng(Len(sValue) +  1 ))

    'Close the key
    RegCloseKey phkResult

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

ErrorRoutineErr::
  'MsgBox "ERROR #" & str$(Err) & " : " & Error & Chr(13) _
  '       & "Please exit and try again."
  SetRegValue = False

End Function
'------------------------------------------------------------
Public Function DeleteRegValue(hKey As Long, lpszSubKey As String, sValueName As String, reg64 As Boolean) As Boolean

    On Error GoTo ErrorRoutineErr:
    
    Dim phkResult As Long
    Dim lResult As Long
    Dim SA As SECURITY_ATTRIBUTES
    Dim Create As Long
    'Open or Create the key
    If reg64 Then
        RegCreateKeyEx hKey, lpszSubKey,  0 , "", _
            REG_OPTION_NON_VOLATILE, _
             KEY_ALL_ACCESS Or KEY_WOW64_64KEY, SA, phkResult, Create
    Else
        RegCreateKeyEx hKey, lpszSubKey,  0 , "", _
            REG_OPTION_NON_VOLATILE, _
            KEY_ALL_ACCESS, SA, phkResult, Create
    End If
    lResult = RegDeleteValue(phkResult, sValueName)
    RegCloseKey (phkResult)
    'Return obtained value
    If lResult = ERROR_SUCCESS Then
        DeleteRegValue = True
    Else
        DeleteRegValue = False
    End If
    Exit Function
ErrorRoutineErr::
    DeleteRegValue = False
End Function
Ну и собственно чего прога делает:
Код: plaintext
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.
'...
        ElseIf (InStr(WinSysVer.VersionName, "Windows Vista") >  0 ) Then
'...
            ElseIf InStr(Command, "/ProgaInstReg") >  0  Then 'установка ключей реестра
                If OStype = "x64" Then
                    SetRegValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", _
                        AppPath & "proga1.exe", "RUNASADMIN", True
                    SetRegValue HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", _
                        AppPath & "proga2.exe", "WIN98", True
'...
                Else
                    SetRegValue HKEY_LOCAL_MACHINE, _
                        "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", _
                        AppPath & "proga1.exe", "RUNASADMIN", False
                    SetRegValue HKEY_LOCAL_MACHINE, _
                        "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", _
                        AppPath & "proga2.exe", "WIN98", False
                End If
            ElseIf InStr(Command, "/ProgaUninstReg") >  0  Then 'удаление ключей реестра
                If OStype = "x64" Then
                    DeleteRegValue HKEY_LOCAL_MACHINE, _
                        "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", _
                        AppPath & "proga1.exe", True
                    DeleteRegValue HKEY_LOCAL_MACHINE, _
                        "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", _
                        AppPath & "proga2.exe", True
'...
                Else
                    DeleteRegValue HKEY_LOCAL_MACHINE, _
                        "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", _
                        AppPath & "proga1.exe", False
                    DeleteRegValue HKEY_LOCAL_MACHINE, _
                        "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", _
                        AppPath & "proga2.exe", False
'...
                End If
            End If
        Else
'...
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / x64 и опять неправильные пути, реестр на сей раз... / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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