Вчера залип на этой задаче, многие предлагают обратиться к старой библиотеке - 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)
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 в одно. Есть и другие аналоги, но я не тестировал.
Комментарии
Отправить комментарий