powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как зная phkeyOut ветки реестра (Key) получить ее название (из буков)?
3 сообщений из 3, страница 1 из 1
А как зная phkeyOut ветки реестра (Key) получить ее название (из буков)?
    #38641523
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. например есть ф-ция AssocQueryKey function
Код такой:
Код: 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.
Public Declare Function AssocQueryKey Lib "shlwapi.dll" Alias "AssocQueryKeyA" _
 (ByVal Flags As ASSOCF, ByVal key As ASSOCKEY, _
 ByVal pszAssoc As String, ByVal pszExtra As String, _
 ByRef phkeyOut As Long) As Long

Public Function AssocQKey(ByVal Flags As ASSOCF, ByVal GetKey As ASSOCKEY, _
 ByVal m_Ext As String, Optional ByVal m_Verb As String = "") As Long
  Dim Verb As String
  Dim n As Long
   
  ' Always ignore "Unknown" progids
  Flags = Flags Or ASSOCF_IGNOREUNKNOWN
   
  ' Different strings need different verbs.
  Select Case GetKey
    Case ASSOCSTR_SHELLNEWVALUE, ASSOCSTR_INFOTIP, _
     ASSOCSTR_QUICKTIP, ASSOCSTR_CONTENTTYPE, _
     ASSOCSTR_DEFAULTICON, ASSOCSTR_SHELLEXTENSION
      Verb = vbNullString
    Case Else
      Verb = m_Verb
  End Select
   
  ' Use the AssocQueryKey API to find application
  ' associated with passed document extension.
  n = AssocQueryKey(Flags, GetKey, m_Ext, Verb, AssocQKey)
  If n = S_OK Then
    'для проверки читаем какую-нибудь value, напр. default
    MsgBox GetRegValue(AssocQKey, "", "", "", False)
    RegCloseKey AssocQKey
  End If
End Function

Private Sub CommandProgID_Click()
  MsgBox AssocQKey(0&, ASSOCKEY_CLASS, ".jpg")
End Sub


Т.е. в ветку реестра то я попал. Внутри нее все прочитать могу, потому как мне дали handle этой ветки.
А как мне название-то ее прочесть?

Мы В МЕСТЕ, но даже не знаем в каком.

В данном конкретном случае это очевидно "HKEY_CLASSES_ROOT\jpegfile",
вот нечто типа этого я и хочу прочесть. Как?
Вопрос актуален в связи с предыдущей темой.
...
Рейтинг: 0 / 0
А как зная phkeyOut ветки реестра (Key) получить ее название (из буков)?
    #38641667
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако.

ZwQueryKey routine

http://stackoverflow.com/questions/937044/determine-path-to-registry-key-from-hkey-handle-in-c

Код: 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.
Public Enum KEY_INFORMATION_CLASS
  KeyBasicInformation = 0
  KeyNodeInformation = 1
  KeyFullInformation = 2
  KeyNameInformation = 3
  KeyCachedInformation = 4
  KeyFlagsInformation = 5
  KeyVirtualizationInformation = 6
  KeyHandleTagsInformation = 7
  MaxKeyInfoClass = 8
End Enum

Public Type KEY_NAME_INFORMATION
  NameLength As Long
  Name As String
End Type

Private Const STATUS_BUFFER_TOO_SMALL = &HC0000023
Private Const STATUS_SUCCESS = 0
 
Public Declare Function NtQueryKey Lib "ntdll.dll" (ByVal KeyHandle As Long, _
 ByVal KeyInformationClass As KEY_INFORMATION_CLASS, KeyInformation As Any, _
 ByVal length As Long, ByRef ResultLength As Long) As Long
Public Function GetRegKeyName(ByVal hKey As Long) As String

  Dim Buffer As String
  Dim m_size As Long

  'запрашиваем сначала длину буфера
  If NtQueryKey(hKey, _
   KeyNameInformation, ByVal 0&, 0, m_size) = STATUS_BUFFER_TOO_SMALL Then
    m_size = m_size + 2
    Buffer = StrConv(String$(m_size / 2, 0), vbUnicode) 'size is in bytes
    If NtQueryKey(hKey, KeyNameInformation, ByVal Buffer, m_size, m_size) _
     = STATUS_SUCCESS Then
     'первые 4 байта NameLength -длина Name
     GetRegKeyName = _
      StrConv(Left(Right(Buffer, Len(Buffer) - 4), AscW(Left(Buffer, 2))), vbFromUnicode)
    End If
  End If
End Function
...
Рейтинг: 0 / 0
А как зная phkeyOut ветки реестра (Key) получить ее название (из буков)?
    #38642913
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот за что я ненавижу VB-шную StrConv, что-нибудь гадина да и сделает не так.
Занимается приписками "спецсимволов" к строке на Win 8, почему это делает понять не удалось.

Пришлось-таки переделывать код аккуратно:

Код: 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.
55.
56.
57.
58.
59.
60.
61.
62.
63.
Public Enum KEY_INFORMATION_CLASS
  KeyBasicInformation = 0
  KeyNodeInformation = 1
  KeyFullInformation = 2
  KeyNameInformation = 3
  KeyCachedInformation = 4
  KeyFlagsInformation = 5
  KeyVirtualizationInformation = 6
  KeyHandleTagsInformation = 7
  MaxKeyInfoClass = 8
End Enum

Public Type KEY_NAME_INFORMATION
  NameLength As Long
  UName() As Byte
End Type

Private Const STATUS_BUFFER_TOO_SMALL = &HC0000023
Private Const STATUS_SUCCESS = 0
 
Public Declare Function NtQueryKey Lib "ntdll.dll" (ByVal KeyHandle As Long, _
 ByVal KeyInformationClass As KEY_INFORMATION_CLASS, KeyInformation As Any, _
 ByVal length As Long, ByRef ResultLength As Long) As Long

Public Const CP_ACP = 0 'ANSI CodePage

Public Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, _
                                                    ByVal dwFlags As Long, _
                                                    ByVal lpWideCharStr As Long, _
                                                    ByVal cchWideChar As Long, _
                                                    ByVal lpMultiByteStr As Long, _
                                                    ByVal cbMultiByte As Long, _
                                                    ByVal lpDefaultChar As Long, _
                                                    ByVal lpUsedDefaultChar As Long) As Long


Public Function GetRegKeyName(ByVal hKey As Long) As String
  Dim m_size As Long
  Dim i As Long

  'запрашиваем сначала длину буфера (в байтах)
  If NtQueryKey(hKey, _
   KeyNameInformation, ByVal 0&, 0, m_size) = STATUS_BUFFER_TOO_SMALL Then

    Dim ByteStrUnicode() As Byte
    ReDim ByteStrUnicode(0 To m_size - 1) 'резервируем буфер
    If NtQueryKey(hKey, KeyNameInformation, ByVal VarPtr(ByteStrUnicode(0)), m_size, m_size) _
     = STATUS_SUCCESS Then
      'первые 4 байта - это NameLength (длина Name в байтах)
      CopyMemory m_size, ByVal VarPtr(ByteStrUnicode(0)), 4
      m_size = m_size / 2 'длина строки в символах = длине ANSI-байт массива
      Dim ByteStrANSI() As Byte
      ReDim ByteStrANSI(0 To m_size - 1) 'резервируем буфер для приема ANSI-строки
      If WideCharToMultiByte(CP_ACP, 0&, ByVal VarPtr(ByteStrUnicode(4)), m_size, _
       ByVal VarPtr(ByteStrANSI(0)), m_size, 0&, 0&) <> 0 Then
        For i = 0 To m_size - 1
          If ByteStrANSI(i) = 0 Then Exit For 'страховка
          GetRegKeyName = GetRegKeyName & Chr(ByteStrANSI(i))
        Next i
      End If
    End If
  End If
End Function
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А как зная phkeyOut ветки реестра (Key) получить ее название (из буков)?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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