10 REM > BLib.Win.Registry 1.02 18Jul2008
   20 ;
   30 REM General Windows registry access functions
   40 REM =========================================
   50 REM 18May2006 v0.10 JGH: Initial draft
   60 REM 12Aug2007 v1.00 JGH: Initial release
   70 REM 13Aug2007 v1.01 JGH: Debugged, tested first release
   80 REM 18Jul2008 v1.02 JGH: Rd() always returns string if asked for string
   90 :
  100 REM Registry_Init - set variables to refer to various registry hives
  110 REM ----------------------------------------------------------------
  120 :
  130 DEFPROCRegistry_Init
  140 reg_hkcr%=&80000000:REM HKEY_CLASSES_ROOT
  150 reg_hkcu%=&80000001:REM HKEY_CURRENT_USER
  160 reg_hklm%=&80000002:REM HKEY_LOCAL_MACHINE
  170 reg_hku% =&80000003:REM HKEY_USERS
  180 reg_hkpd%=&80000004:REM HKEY_PERFORMANCE_DATA
  190 reg_hkcc%=&80000005:REM HKEY_CURRENT_CONFIG
  200 reg_hkdd%=&80000006:REM HKEY_DYN_DATA
  210 reg_hkpt%=&80000050:REM HKEY_PERFORMANCE_TEXT
  220 reg_hkpn%=&80000060:REM HKEY_PERFORMANCE_NLSTEXT
  230 :
  240 reg_NONE%=0
  250 reg_SZ%=1
  260 reg_EXPAND_SZ%=2
  270 reg_BINARY%=3
  280 reg_DWORD%=4
  290 reg_DWORD_LITTLE_ENDIAN%=4
  300 reg_DWORD_BIG_ENDIAN%=5
  310 reg_LINK%=6
  320 reg_MULTI_SZ%=7
  330 :
  340 REM #define KEY_QUERY_VALUE          0x0001
  350 REM #define KEY_ENUMERATE_SUB_KEYS   0x0008
  360 ENDPROC
  370 :
  380 :
  390 REM Registry_Wr - Write a registry value as the specified type
  400 REM ----------------------------------------------------------
  410 REM Registry_WrInt() and Registry_WrBig() pass the value as an integer
  420 REM Registry_WrStr() passes the value as a string
  430 REM Registry_Wr() pass the value or a pointer to the value
  440 :
  450 DEFPROCRegistry_WrInt(hk%,Key$,Item$,Value%):LOCAL Type%:Type%=4
  460 DEFPROCRegistry_WrBig(hk%,Key$,Item$,Value%):LOCAL Type%:Type%=5
  470 DEFPROCRegistry_WrStr(hk%,Key$,Item$,Value$,Type%)
  480 DEFPROCRegistry_Wr(   hk%,Key$,Item$,Value%,Len%,Type%):ENDPROC
  490 LOCAL K%,D%,R%
  500 SYS "RegCreateKeyEx",hk%,Key$,0,"",0,&F003F,0,^K%,^D% TO R%
  510 IF R%=0 THEN
  520   CASE Type% OF
  530     WHEN 1,2,3,6,7:SYS "RegSetValueEx",K%,Item$,0,1,Value$,LENValue$+1
  540     WHEN 4,5      :SYS "RegSetValueEx",K%,Item$,0,4,Value%,4
  550   ENDCASE
  560   SYS "RegCloseKey",K%
  570 ENDIF
  580 ENDPROC
  590 :
  600 :
  610 REM Registry_Rd - Read a registry value as the requested type
  620 REM ---------------------------------------------------------
  630 REM Registry_RdInt() and Registry_RdBig() return the value as an integer
  640 REM Registry_RdStr() and Registry_Rd() return the value as a string
  650 :
  660 DEFFNRegistry_RdInt(hk%,Key$,Item$):LOCAL Want%:Want%=4
  670 DEFFNRegistry_RdBig(hk%,Key$,Item$):LOCAL Want%:Want%=4
  680 DEFFNRegistry_RdStr(hk%,Key$,Item$):LOCAL Want%:Want%=1
  690 DEFFNRegistry_Rd(   hk%,Key$,Item$):LOCAL Want%:Want%=0
  700 LOCAL K%,R%,L%,T%,S$,Buf%
  710 SYS "RegOpenKeyEx",hk%,Key$,0,&20001,^K% TO R%
  720 IF R%=0 THEN
  730   SYS "RegQueryValueEx",K%,Item$,0,^T%,0,^L%:DIM Buf% LOCAL L%
  740   SYS "RegQueryValueEx",K%,Item$,0,^T%,Buf%,^L% TO R%
  750   SYS "RegCloseKey",K%
  760 ENDIF
  770 IF Want%=4 :IF R%:=0
  780 IF Want%=4 :=!Buf%
  790 IF R%:=""
  800 IF Want%=1:Buf%?(L%-1)=0:=$$Buf%
  810 K%=Buf%:WHILE L%:S$=S$+CHR$?K%:K%=K%+1:L%=L%-1:ENDWHILE
  820 =S$
  830 :
  840 :
  850 REM Registry_Del - Delete a registry value or key
  860 REM ---------------------------------------------
  870 :
  880 DEFPROCRegistry_Del(hk%,Key$,Item$)
  890 IF Item$ ="":SYS "RegDeleteKey",hk%,Key$:ENDPROC
  900 SYS "RegOpenKeyEx",hk%,Key$,0,&20001,^K% TO R%
  910 IF R%=0:SYS "RegDeleteValue",K%,Item$
  920 ENDPROC
  930 :
  940 :
  950 REM Registry_Info - Read a registry value's type
  960 REM --------------------------------------------
  970 :
  980 DEFFNRegistry_Info(hk%,Key$,Item$)
  990 LOCAL K%,R%,L%,T%
 1000 SYS "RegOpenKeyEx",hk%,Key$,0,&20001,^K% TO R%
 1010 IF R%=0 THEN
 1020   SYS "RegQueryValueEx",K%,Item$,0,^T%,0,0 TO R%
 1030   SYS "RegCloseKey",K%
 1040   IF R%:T%=0
 1050 ENDIF
 1060 =T%
 1070 :
 1080 :
 1090 REM Registry_Vals - List registry values
 1100 REM -------------------------------------
 1110 :
 1120 DEFFNRegistry_List(hk%,Key$,RETURN index%)
 1130 DEFFNRegistry_Vals(hk%,Key$,RETURN index%)
 1140 LOCAL K%,R%,L%,Buf%:L%=255:DIM Buf% LOCAL L%
 1150 SYS "RegOpenKeyEx",hk%,Key$,0,&2003F,^K% TO R%
 1160 IF R%=0 THEN
 1170   SYS "RegEnumValue",K%,index%,Buf%,^L%,0,0,0,0 TO R%
 1180   SYS "RegCloseKey",K%
 1190   IFR%=0:index%=index%+1:Buf%?L%=0:=$$Buf%
 1200 ENDIF
 1210 :=""
 1220 :
 1230 :
 1240 REM Registry_Keys - List registry subkeys
 1250 REM -------------------------------------
 1260 :
 1270 DEFFNRegistry_Keys(hk%,Key$,RETURN index%)
 1280 REM LOCAL K%,R%,L%,Buf%
 1290 LOCAL K%,R%,L%,Buf%:L%=255:DIM Buf% LOCAL L%
 1300 SYS "RegOpenKeyEx",hk%,Key$,0,&2003F,^K% TO R%
 1310 IF R%=0 THEN
 1320   REM SYS "RegEnumKey",K%,index%,0,^L%:DIM Buf% LOCAL L%
 1330   SYS "RegEnumKey",K%,index%,Buf%,^L% TO R%
 1340   SYS "RegCloseKey",K%
 1350   IFR%=0:index%=index%+1:Buf%?L%=0:=$$Buf%
 1360 ENDIF
 1370 :=""
 1380 :