Делал недавно одну утилитку в которой нужно было управлять конкретными значениями в конкретных ключах реестра.
Что бы не ковыряться каждый раз с низкоуровневыми вызовами сделал высокоуровневую обертку.
Может кому пригодится.

Файл ssReg.pbi

Код:
Global ssRegIsError=#False
Global ssRegErrorCode.l
Global ssRegErrorText.s

Procedure.s ssRegGetErrorText(ErrCode)
	Define result.s=""
	Protected *Memory = AllocateMemory (255)
	Protected length = FormatMessage_ (#FORMAT_MESSAGE_FROM_SYSTEM, #Null, ErrCode, 0, *Memory, 255, #Null)
	result=PeekS (*Memory, length - 2)
	FreeMemory (*Memory)
	ProcedureReturn result
EndProcedure

Procedure ssRegCheckRoot(Root$) ;проверяет и возвращает числовое значение корня
	Protected RegBranch
	If Root$="HKEY_CURRENT_USER"
    RegBranch=#HKEY_CURRENT_USER
	ElseIf Root$="HKEY_LOCAL_MACHINE"
    RegBranch=#HKEY_LOCAL_MACHINE
	Else
    ssRegIsError=#True
    ssRegErrorCode=0
    ssRegErrorText="Недопустимый корень ключа реестра - можно только HKEY_CURRENT_USER или HKEY_LOCAL_MACHINE"
    ProcedureReturn #False
	EndIf
	ProcedureReturn RegBranch
EndProcedure

Procedure ssRegCheckType(VType$) ;проверяет и возвращает числовое значение типа
	Protected nVType
	ssRegIsError=#False
	If VType$="REG_SZ"
    nVType=#REG_SZ
	ElseIf VType$="REG_DWORD"
    nVType=#REG_DWORD
	Else
    ssRegIsError=#True
    ssRegErrorCode=0
    ssRegErrorText="Недопустимый тип значени - можно только REG_SZ или REG_DWORD"
    ProcedureReturn #False
	EndIf
	ProcedureReturn nVType
EndProcedure

Procedure ssRegCreateKey(Key$)
	Protected RegBranch, pos=FindString(Key$,"\")
	Protected Root$=Left(Key$,pos-1), subKey$=Mid(Key$,pos+1)
	ssRegIsError=#False
	RegBranch=ssRegCheckRoot(Root$)
	If RegBranch=#False Or ssRegIsError
    ProcedureReturn #False
	EndIf
	; LONG WINAPI RegCreateKeyEx(
	;   _In_        HKEY hKey,
	;   _In_        LPCTSTR lpSubKey,
	;   _Reserved_  DWORD Reserved,
	;   _In_opt_    LPTSTR lpClass,
	;   _In_        DWORD dwOptions,
	;   _In_        REGSAM samDesired,
	;   _In_opt_    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
	;   _Out_       PHKEY phkResult,
	;   _Out_opt_   LPDWORD lpdwDisposition
	; );	
	Protected hKey
	Protected OperType ;see below
	;REG_CREATED_NEW_KEY(0x00000001L) The key did not exist and was created.
	;REG_OPENED_EXISTING_KEY(0x00000002L) The key existed and was simply opened without being changed.
	Protected res=RegCreateKeyEx_(RegBranch, subKey$, 0, #Null, 0, #KEY_ALL_ACCESS, #Null, @hKey, @OperType)
	If res=#ERROR_SUCCESS
    RegCloseKey_(hKey)
    ProcedureReturn OperType
	Else
    ssRegIsError=#True
    ssRegErrorCode = res
    ssRegErrorText=ssRegGetErrorText(ssRegErrorCode)
    ProcedureReturn #False
	EndIf
EndProcedure

Procedure ssRegDeleteKey(Key$)
	Protected RegBranch, pos=FindString(Key$,"\")
	Protected Root$=Left(Key$,pos-1), subKey$=Mid(Key$,pos+1)
	ssRegIsError=#False
	RegBranch=ssRegCheckRoot(Root$)
	If RegBranch=#False Or ssRegIsError
    ProcedureReturn #False
	EndIf
	; 	LONG WINAPI RegDeleteKeyEx(
	;   _In_        HKEY hKey,
	;   _In_        LPCTSTR lpSubKey,
	;   _In_        REGSAM samDesired,
	;   _Reserved_  DWORD Reserved
	;   );
	; LONG WINAPI RegDeleteTree(
	;   _In_      HKEY hKey,
	;   _In_opt_  LPCTSTR lpSubKey
	; );
	;Protected res=RegDeleteTree_(RegBranch,subKey$)
	
	; LSTATUS SHDeleteKey(
	; _In_      HKEY hkey,
	; _In_opt_  LPCTSTR pszSubKey
	; );
	Protected res=SHDeleteKey_(RegBranch,subKey$)
	
	If res=#ERROR_SUCCESS
    ProcedureReturn #True
	Else
    ssRegIsError=#True
    	ssRegErrorCode = GetLastError_()
    	ssRegErrorText=ssRegGetErrorText(ssRegErrorCode)
    ProcedureReturn #False
	EndIf
EndProcedure

Procedure ssRegKeyExist(Key$)
	Protected RegBranch, pos=FindString(Key$,"\")
	Protected Root$=Left(Key$,pos-1), subKey$=Mid(Key$,pos+1)
	ssRegIsError=#False
	RegBranch=ssRegCheckRoot(Root$)
	If RegBranch=#False Or ssRegIsError
    ProcedureReturn #False
	EndIf
	
	;result = RegOpenKeyEx_ (RegBranch , subkey$, 0, flags, @gKeyHandle)
	Protected hKey
	Protected result = RegOpenKeyEx_ (RegBranch , subkey$, 0, #KEY_ALL_ACCESS, @hKey)
	If result = #ERROR_SUCCESS
    RegCloseKey_(hKey)
    	ProcedureReturn #True
    Else
    	ssRegIsError=#True
    	ssRegErrorCode = GetLastError_()
    	ssRegErrorText=ssRegGetErrorText(ssRegErrorCode)
    	ProcedureReturn #False
    EndIf
EndProcedure

Procedure ssRegSetValue(Key$, VName$, VType$, VData$)
	Protected RegBranch, pos=FindString(Key$,"\")
	Protected Root$=Left(Key$,pos-1), subKey$=Mid(Key$,pos+1)
	ssRegIsError=#False
	RegBranch=ssRegCheckRoot(Root$)
	If RegBranch=#False Or ssRegIsError
    ProcedureReturn #False
	EndIf
	; проверить тип значения
	Protected nVType=ssRegCheckType(VType$)
	If nVType=#False Or ssRegIsError
    ProcedureReturn #False
	EndIf
	;
	If nVType=#REG_SZ ;удвоить \ => \\
;     Protected Tmp$="" ;PeekS(*VData), VData$=""
;     ;n=CountString(Tmp$, "\")
;     n=CountString(VData$, "\")
;     If n>0
;     	For i=1 To n
;         Tmp$+StringField(VData$, i, "\")+"\\"
;     	Next
;     	Tmp$+StringField(VData$, n+1, "\")
;     EndIf
	ElseIf nVType=#REG_DWORD
    Protected nVData.l=Val(VData$)
	EndIf
	;
	Protected hKey
	Protected res = RegOpenKeyEx_ (RegBranch , subkey$, 0, #KEY_ALL_ACCESS, @hKey)
	If res = #ERROR_SUCCESS
    ; LONG WINAPI RegSetValueEx(
    ;   _In_        HKEY hKey,
    ;   _In_opt_    LPCTSTR lpValueName,
    ;   _Reserved_  DWORD Reserved,
    ;   _In_        DWORD dwType,
    ;   _In_        const BYTE *lpData,
    ;   _In_        DWORD cbData
    ; );
    If nVType=#REG_SZ
    	;res=RegSetValueEx_(hKey, VName$, 0, nVType, @Tmp$, Len(Tmp$)+1)
    	res=RegSetValueEx_(hKey, VName$, 0, nVType, @VData$, Len(VData$)+1)
    ElseIf nVType=#REG_DWORD
    	res=RegSetValueEx_(hKey, VName$, 0, nVType, @nVData, 4)
    EndIf
    
    RegCloseKey_(hKey)
    
    If res = #ERROR_SUCCESS
    	ProcedureReturn #True
    Else
    	ssRegIsError=#True
    	ssRegErrorCode = res
    	ssRegErrorText=ssRegGetErrorText(ssRegErrorCode)
    	ProcedureReturn #False
    EndIf
	Else
    ssRegIsError=#True
    ssRegErrorCode = res
    ssRegErrorText=ssRegGetErrorText(ssRegErrorCode)
    ProcedureReturn #False
	EndIf
EndProcedure

Procedure ssRegGetValue(Key$, VName$, *VType.String, *VData.String)
	Protected RegBranch, pos=FindString(Key$,"\")
	Protected Root$=Left(Key$,pos-1), subKey$=Mid(Key$,pos+1)
	ssRegIsError=#False
	RegBranch=ssRegCheckRoot(Root$)
	If RegBranch=#False Or ssRegIsError
    ProcedureReturn #False
	EndIf
	
	Protected hKey
	Protected res = RegOpenKeyEx_ (RegBranch , subKey$, 0, #KEY_ALL_ACCESS, @hKey)
	If res <> #ERROR_SUCCESS ;ошибка при открытии ключа
    	ssRegIsError=#True
    	ssRegErrorCode = GetLastError_()
    	ssRegErrorText=ssRegGetErrorText(ssRegErrorCode)
    	ProcedureReturn #False
    Else
    	Protected lpType.l
    	Protected lpcbData = 255
    	Protected lpData.s=Space(lpcbData)
    	
    	res = RegQueryValueEx_(hKey, VName$, 0, @lType, @lpData, @lpcbData)
    	RegCloseKey_(hKey)
    	
    	If res=#ERROR_SUCCESS
        If lType=#REG_SZ
        	*VType\s="REG_SZ"
        	*VData\s=PeekS(@lpData)
        ElseIf lType=#REG_DWORD
        	*VType\s="REG_DWORD"
        	*VData\s=Str(PeekL(@lpData))
        Else
        	ssRegIsError=#True
        	ssRegErrorCode = 0
        	ssRegErrorText="Недопустимый тип значения"
        	ProcedureReturn #False
        EndIf
        
        ProcedureReturn #True
    	Else
        ssRegIsError=#True
        ssRegErrorCode = res
        ssRegErrorText=ssRegGetErrorText(ssRegErrorCode)
        ProcedureReturn #False
    	EndIf
    	
    EndIf
	
EndProcedure

Procedure ssRegDeleteValue(Key$, VName$)
	Protected RegBranch, pos=FindString(Key$,"\")
	Protected Root$=Left(Key$,pos-1), subKey$=Mid(Key$,pos+1)
	ssRegIsError=#False
	RegBranch=ssRegCheckRoot(Root$)
	If RegBranch=#False Or ssRegIsError
    ProcedureReturn #False
	EndIf
	
	Protected hKey
	Protected res = RegOpenKeyEx_ (RegBranch , subKey$, 0, #KEY_ALL_ACCESS, @hKey)
	If res <> #ERROR_SUCCESS ;ошибка при открытии ключа
    	ssRegIsError=#True
    	ssRegErrorCode = GetLastError_()
    	ssRegErrorText=ssRegGetErrorText(ssRegErrorCode)
    	ProcedureReturn #False
    Else
    ; LSTATUS SHDeleteValue(
    ; HKEY hkey,
    ; LPCTSTR pszSubKey,
    ; LPCTSTR pszValue
    ; );
    	
    ;res = SHDeleteValue_(hKey, subKey$, VName$)
    
    ; LONG WINAPI RegDeleteValue(
    ;   _In_      HKEY hKey,
    ;   _In_opt_  LPCTSTR lpValueName
    ; );
    ; 
    res = RegDeleteValue_(hKey, VName$)
    
    	RegCloseKey_(hKey)
    	
    	If res=#ERROR_SUCCESS
        ProcedureReturn #True
    	Else
        ssRegIsError=#True
        ssRegErrorCode = res
        ssRegErrorText=ssRegGetErrorText(ssRegErrorCode)
        ProcedureReturn #False
    	EndIf
    	
    EndIf    	
    	
EndProcedure

пользовательские функции
    ssRegKeyExist(Key$)
    ssRegCreateKey(Key$)
    ssRegDeleteKey(Key$)
    ssRegSetValue(Key$, VName$, VType$, VData$)
    ssRegGetValue(Key$, VName$, *VType.String, *VData.String)
    ssRegDeleteValue(Key$, VName$)
остальные - внутренние.

Функции возвращают логическое значение.
При возвращенном значении #False еще устанавливаются глобальные переменные
ssRegIsError=#True
ssRegErrorCode - код ошибки
ssRegErrorText - текст описания ошибки

Если значения не существует то ssRegGetValue()=#False и ssRegErrorCode =2

Ограничения.
Тип значения только "REG_SZ" и "REG_DWORD". Задаются именно такой текстовой строкой.
Ветви реестра только "HKEY_CURRENT_USER" и "HKEY_LOCAL_MACHINE". Задаются именно такой текстовой строкой.
В ssRegSetValue() данные передаются строкой - даже число типа "REG_DWORD"
пример:

Код:
Key$="HKEY_CURRENT_USER\Software\Diasoft\MICalculator\UserSettings"
VNAME$="Активный скин"
VTYPE$="REG_SZ"
VDATA$="CzInsCorp"
if ssRegSetValue(Key$, VName$, VType$, VData$)
...
else
...
endif

VNAME$="Number"
VTYPE$="REG_DWORD"
VDATA$=str(456)
if ssRegSetValue(Key$, VName$, VType$, VData$)
...
else
...
endif

Этим набором функций нельзя исследовать реестр т.к. нет функций перебора т.к. не стояла такая задача.