RegExport

Everything else that doesn't fall into one of the other PB categories.
AZJIO
Addict
Addict
Posts: 1318
Joined: Sun May 14, 2017 1:48 am

RegExport

Post by AZJIO »

I made an attempt to export to a reg file. Maybe someone has already done this, but I haven't found it.

Code: Select all

EnableExplicit

#q$ = Chr(34)

XIncludeFile "Registry.pbi"
UseModule Registry

Procedure.s EscapeRegString(str$)
	str$ = ReplaceString(str$, "\", "\\")
	str$ = ReplaceString(str$, #q$, "\" + #q$)
	ProcedureReturn str$
EndProcedure

Procedure.s RegExport(root, keypath$, *RegData.string)
	Protected root$, count, i, param$, VType, ValueStr$
	Select root
		Case #HKEY_CLASSES_ROOT
			root$ ="[HKEY_CLASSES_ROOT\"
		Case #HKEY_CURRENT_USER
			root$ ="[HKEY_CURRENT_USER\"
		Case #HKEY_LOCAL_MACHINE
			root$ ="[HKEY_LOCAL_MACHINE\"
		Case #HKEY_USERS
			root$ ="[HKEY_USERS\"
		Case #HKEY_CURRENT_CONFIG
			root$ ="[HKEY_CURRENT_CONFIG\"
	EndSelect
	*RegData\s + #CRLF$ + root$ +keypath$ + "]" + #CRLF$
	count = CountSubValues(root, keypath$)
	For i = 0 To count - 1
		param$ = ListSubValue(root, keypath$, i)
		VType = ReadType(root, keypath$, param$)
		Select VType
			Case #REG_SZ, #REG_EXPAND_SZ, #REG_MULTI_SZ
				ValueStr$ = ReadValue(root, keypath$, param$)
				param$ = #q$ + param$ + #q$
				If param$ = #q$ + #q$
					param$ = "@"
				EndIf
				ValueStr$ = EscapeRegString(ValueStr$)
				*RegData\s + param$ + "=" + #q$ + ValueStr$ + #q$ + #CRLF$
				; WriteString(0, param$ + "=" + ValueStr$ + #CRLF$, #PB_Unicode)
			Case #REG_DWORD
				ValueStr$ = ReadValue(root, keypath$, param$)
				param$ = #q$ + param$ + #q$
				*RegData\s + param$ + "=dword:" + RSet(Hex(Val(ValueStr$), #PB_Quad) , 8 , "0") + #CRLF$
			Case #REG_QWORD
				ValueStr$ = ReadValue(root, keypath$, param$)
				param$ = #q$ + param$ + #q$
				*RegData\s + param$ + "=qword:" + RSet(Hex(Val(ValueStr$), #PB_Quad) , 16 , "0") + #CRLF$
; 			Case #REG_NONE, #REG_BINARY
		EndSelect
	Next
	count = CountSubKeys(root, keypath$)
	For i = 0 To count - 1
		param$ = ListSubKey(root, keypath$, i)
		RegExport(root, keypath$ + "\" + param$, *RegData)
	Next
EndProcedure

Define RegData.String, FileName$
RegExport(#HKEY_CLASSES_ROOT, "txtfile", @RegData)
RegExport(#HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.7z", @RegData)
; Debug RegData\s
; SetClipboardText(RegData\s)
; MessageRequester("", RegData\s)

If Len(RegData\s) > 3
	FileName$ = SaveFileRequester("Save" , "Export.reg" , "Registry (*.reg)|*.reg", 0)
	If Asc(FileName$)
		If CreateFile(0, FileName$, #PB_Unicode)
			WriteStringFormat(0 , #PB_Unicode) ; BOM (16 LE)
			WriteString(0, "Windows Registry Editor Version 5.00" + #CRLF$, #PB_Unicode)
			WriteString(0, RegData\s + #CRLF$ + #CRLF$, #PB_Unicode)
			CloseFile(0)
			RunProgram("explorer.exe", "/Select, " + FileName$, "")
; 			If MessageRequester("Message","Open File?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
; 				RunProgram("notepad.exe", #q$ + FileName$ + #q$, "")
; 			EndIf
		EndIf
	EndIf
EndIf
AZJIO
Addict
Addict
Posts: 1318
Joined: Sun May 14, 2017 1:48 am

Re: RegExport

Post by AZJIO »

How to make it work?
REG EXPORT "HKEY_CLASSES_ROOT\.txt" "C:\folder\Export3.reg"

Code: Select all

EnableExplicit

Import "user32.lib"
	OemToCharBuffA(*Buff,*Buff1,SizeBuff)
	CharToOemBuffA(*Buff,*Buff1,SizeBuff)
EndImport

; Windows1251 в 866
Procedure.s ToOem(String$)
	Protected Ret$="", *Buff, SizeBuff=Len(String$)
	If SizeBuff>0
; 		*Buff=AllocateMemory(SizeBuff+1)
; 		PokeS(*Buff, String$, SizeBuff, #PB_Ascii)
		*Buff = Ascii(String$)
		CharToOemBuffA(*Buff, *Buff, SizeBuff)
		Ret$=PeekS(*Buff, SizeBuff, #PB_Ascii)
		FreeMemory(*Buff)
	EndIf
	ProcedureReturn Ret$
EndProcedure

#q$ = Chr(34)
#File = 0
#FileBak = 1
Procedure Copy(*FileName.String, *regpath.String, *FileBak.String)
	Protected length, *mem, bytes
; 	Debug *regpath\s
; 	Debug *FileName\s
; 	Debug *FileBak\s
; 	очистка файла чтобы гарантировать непопадание старых данных при ошибке reg.exe
	If OpenFile(#FileBak,*FileBak\s, #PB_File_SharedWrite | #PB_File_SharedRead)
		FileSeek(#FileBak, 0)
		TruncateFile(#FileBak)
		CloseFile(#FileBak)
	EndIf
	*regpath\s = ToOem(*regpath\s)
	Debug *regpath\s
	RunProgram("reg.exe", *regpath\s, "", #PB_Program_Wait | #PB_Program_Hide)
; 	RunProgram("regedit.exe", "-e " + *regpath\s, "", #PB_Program_Wait)
; 	Debug FileSize(*FileBak\s)
	If ReadFile(#FileBak, *FileBak\s)
		length = Lof(#FileBak)
; 		FileSeek(#FileBak, 36) ; length - 36
		If length
			*mem = AllocateMemory(length)
			If *mem
				bytes = ReadData(#FileBak, *mem, length)
				If bytes
					WriteData(#File , *mem , length)
				EndIf
				FreeMemory(*mem)
			EndIf
		EndIf
		CloseFile(#FileBak)
	EndIf
EndProcedure

Procedure.s RegExport()
	Protected regpath.String, FileName.String, FileBak.String, RegPath$
	RegPath$ = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\."
	FileName\s = SaveFileRequester("Save" , "Export.reg" , "Registry (*.reg)|*.reg", 0)
	If FileName\s
		FileBak\s = FileName\s + ".bak"
		If CreateFile(#File, FileName\s, #PB_Unicode)
			WriteStringFormat(#File, #PB_Unicode) ; BOM (16 LE)
			regpath\s = "\y " + #q$ + "HKEY_CLASSES_ROOT\." + "txt" + #q$ + " " + #q$ + FileBak\s + #q$
			Copy(@FileName, @regpath, @FileBak)
			regpath\s = "\y " + #q$ + RegPath$ + "txt" + #q$ + " " + #q$ + FileBak\s + #q$
			Copy(@FileName, @regpath, @FileBak)
			regpath\s = "\y " + #q$ + "HKEY_CLASSES_ROOT\" + "txtfile" + #q$ + " " + #q$ + FileBak\s + #q$
			Copy(@FileName, @regpath, @FileBak)
			CloseFile(#File)
		EndIf
		RunProgram("explorer.exe", "/Select, " + FileName\s, "")
	EndIf
EndProcedure

RegExport()
User avatar
ChrisR
Addict
Addict
Posts: 1127
Joined: Sun Jan 08, 2017 10:27 pm
Location: France

Re: RegExport

Post by ChrisR »

I do it like this with admin rights

Code: Select all

Procedure.s RegExport(RegPath$, FileName$)
  If FileSize(FileName$) > 0
    CopyFile(FileName$, FileName$ + ".bak")
  EndIf
  RunProgram("reg.exe", "EXPORT " +#DQUOTE$+ RegPath$ +#DQUOTE$+ " " +#DQUOTE$+ FileName$ +#DQUOTE$+ " /y", "", #PB_Program_Wait|#PB_Program_Hide)
  If FileSize(FileName$) > 0
    ShellExecute_(0, "open", "explorer", "/select," + #DQUOTE$ + FileName$ + #DQUOTE$, GetPathPart(FileName$), #SW_SHOW)
  EndIf
EndProcedure

RegExport("HKCU\Environment", GetTemporaryDirectory() + "Environment.reg")
AZJIO
Addict
Addict
Posts: 1318
Joined: Sun May 14, 2017 1:48 am

Re: RegExport

Post by AZJIO »

The export works. But my task is to export from different places to one file. That is, I export to a file, then copy the data to the end of another file. I will move the pointer so as not to copy the title. The problem is when I use quotation marks, as there are spaces in the paths, and also when the path has non-Latin letters, so I added OEM. I'll try again a little later, since I don't understand anything right now.

I used to use this
Post Reply