Чтение реестра на Purebasic

 Вчера залип на этой задаче, многие предлагают обратиться к старой библиотеке - Droopy. Помог один пример:

kn$=".webp"
re=RegOpenKeyEx_(#HKEY_CLASSES_ROOT,@kn$,0,#KEY_ALL_ACCESS,@phkres)
k$=Space(1024)
rsize=1024
re=RegQueryValueEx_(phkres,"",0,0,@k$,@rsize)
Debug k$
re=RegCloseKey_(phkres)

Идея была простой - экспорт всех записей реестра для типа файлов - мне надоело, что некие проги без спроса ассоциируют под себя типы файлов .bin, .scr. Пока вышло вот что:

kn$=".bmp";".webp"
*m=AllocateMemory(1024)
rsize=1024
keyn=1
k$=""
If RegOpenKeyEx_(#HKEY_CLASSES_ROOT,@kn$,0,#KEY_ALL_ACCESS,@phkres)=0
  ; LONG RegOpenKeyEx(
  ;     HKEY hKey, // handle of open key 
  ;     LPCTSTR lpSubKey, // address of name of subkey To open 
  ;     DWORD ulOptions, // reserved 
  ;     REGSAM samDesired, // security access mask 
  ;     PHKEY phkResult // address of handle of open key 
  ;    );
  
  RunProgram("reg"," export "+Chr(34)+"HKEY_CLASSES_ROOT\"+kn$+Chr(34)+" bb"+Str(keyn)+".reg /y","",#PB_Program_Open | #PB_Program_Read)
  keyn+1
  If RegQueryValueEx_(phkres,"",0,0,*m,@rsize)=0
    k$=PeekS(*m)
    ; LONG RegQueryValueEx(
    ;     HKEY hKey, // handle of key To query 
    ;     LPTSTR lpValueName, // address of name of value To query 
    ;     LPDWORD lpReserved, // reserved 
    ;     LPDWORD lpType, // address of buffer For value type 
    ;     LPBYTE lpData, // address of Data buffer 
    ;     LPDWORD lpcbData // address of Data buffer size 
    ;    );
;     RunProgram("reg"," export "+Chr(34)+"HKEY_CLASSES_ROOT\"+k$+Chr(34)+" bb"+Str(keyn)+".reg /y","",#PB_Program_Open | #PB_Program_Read)
;     keyn+1
  EndIf
  RegCloseKey_(phkres)
  If k$<>""
    If RegOpenKeyEx_(#HKEY_CLASSES_ROOT,k$,0,#KEY_ALL_ACCESS,@phkres1)=0
      RunProgram("reg"," export "+Chr(34)+"HKEY_CLASSES_ROOT\"+k$+Chr(34)+" bb"+Str(keyn)+".reg /y","",#PB_Program_Open | #PB_Program_Read)
      keyn+1
    EndIf
    RegCloseKey_(phkres1)
  EndIf
EndIf

  ;[-HKEY_CLASSES_ROOT\SystemFileAssociations\.bin]
  s$="SystemFileAssociations\"+kn$
  If RegOpenKeyEx_(#HKEY_CLASSES_ROOT,@s$,0,#KEY_ALL_ACCESS,@phkres2)=0
    RunProgram("reg"," export "+Chr(34)+"HKEY_CLASSES_ROOT\"+s$+Chr(34)+" bb"+Str(keyn)+".reg /y","",#PB_Program_Open | #PB_Program_Read)
    keyn+1
    RegCloseKey_(phkres2)
  EndIf
;HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts + kn$
s$="Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\"+kn$
If RegOpenKeyEx_(#HKEY_CURRENT_USER,@s$,0,#KEY_ALL_ACCESS,@phkres3)=0
  RunProgram("reg"," export "+Chr(34)+"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\"+kn$+Chr(34)+" bb"+Str(keyn)+".reg /y","",#PB_Program_Open | #PB_Program_Read)
  keyn+1
  RegCloseKey_(phkres3)
EndIf

FreeMemory(*m)

Только получается несколько файлов, которые было бы неплохо объединить в один и добавить необходимые записи удаления строк. Вернусь к задаче позже.

Дополнение. Вчера нашел забытую тулзу  RegFileMerger

В описании сказано, что прога позволяет склеить несколько файлов .reg в одно. Есть и другие аналоги, но я не тестировал.

Комментарии