Ooops
October 29, 2020, 02:16:55 AM

Author Topic: [bb] Improved Registry Functions (AdvApi32.dll) by _PJ_ [ 1+ years ago ]  (Read 1353 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Improved Registry Functions (AdvApi32.dll)
Author : _PJ_
Posted : 1+ years ago

Description : A more comprehensive library of functions from AdvAPI32.dll which can be used to manipulate the registry. A few bugs have been addressed, and more value types are now available. In addition, almost all Key hives are now accessible.

Code :
Code: BlitzBasic
  1. ;The following DECLS are required in "..userlibs" directory
  2. ;.lib "advapi32.dll"
  3. ;AdvApi32_RegOpenKey%(hKey%, subKey$, result*):"RegOpenKeyA"
  4. ;AdvApi32_RegCloseKey%(hKey%):"RegCloseKey"
  5. ;AdvApi32_RegQueryValueEx%(hKey%, lpValueName$, lpReserved%, lpType*, lpData*, lpcbData*):"RegQueryValueExA"
  6. ;AdvApi32_RegOpenKeyEx%(hKeyParent%,SubKey$,reserved,samdesired,phkResult*):"RegOpenKeyExA"  
  7. ;AdvApi32_RegFlushKey%(hKey%):"RegFlushKey"
  8. ;AdvApi32_RegCreateKey%(hKeyParent%,SubKey$,phkResult*):"RegCreateKeyA"
  9. ;AdvApi32_RegDeleteKey%(hKeyParent%,SubKey$):"RegDeleteKeyA"
  10. ;AdvApi32_RegSetValueEx%(hKey%,ValueName$,Reserved%,nType%,Bytes*,size%):"RegSetValueExA"
  11. ;AdvApi32_RegDeleteValue%(hKey%,ValueName$):"RegDeleteValueA"
  12. ;AdvApi32_RegEnumKey%(hKey%,idx%,Key*,size%):"RegEnumKeyA"
  13. ;AdvApi32_RegEnumValue%(hKey%,idx%,ValueName*,NameSize*,Reserved%,nType*,ValueBytes*,ValueSize*):"RegEnumValueA"
  14.  
  15. ; registry roots
  16. Const cn4_REG_HKCR%                                                     = -2147483648   ;Classes Root
  17. Const cn4_REG_HKCU%                                                     = -2147483647   ;Current User
  18. Const cn4_REG_HKLM%                                                     = -2147483646   ;Local Machine
  19. Const cn4_REG_HKU%                                                      = -2147483645   ;Users
  20. Const cn4_REG_HKPD%                                                     = -2147483644   ;Performance Data
  21. Const cn4_REG_HKCC%                                                     = -2147483643   ;Current Config
  22. Const cn4_REG_HKDD%                                                     = -2147483642   ;Dynamic Data
  23. Const cn4_REG_HKLS%                                                     = -2147483641   ;Current User Local Settings
  24. Const cn4_REG_HKPT%                                                     = -2147483568   ;Performance Text
  25. Const cn4_REG_HKPN%                                                     = -2147483552   ;Performance NLS Text
  26.  
  27. ; return value constants
  28. Const cm_REG_ERROR_SUCCESS%                                     = 0
  29. Const cm_REG_ERROR_EXPANDED%                                    = 2
  30. Const cm_REG_ERROR_MORE_DATA%                           = 234
  31. Const cm_REG_ERROR_EOF%                                         = 259   ; no more entries in key
  32.  
  33. Const cm_REG_INVALID_KEY%                                               =-1
  34.  
  35. ; data types For keys
  36. Const cm_REG_NONE%                                                      = 0     ; Always as Binary
  37. Const cm_REG_SZ%                                                                = 1     ; Data String
  38. Const cm_REG_EXPAND_SZ%                                         = 2     ; Compressed String value
  39. Const cm_REG_BINARY%                                                    = 3     ; 0x1 0x2 0x3 0x4 Binary in Any Form
  40. Const cm_REG_DWORD%                                                     = 4 ; 0x04030201
  41. Const cm_REG_DWORD_LITTLE_ENDIAN%                               = 4 ; 0x04030201 A 32-bit number (Can also be a 4-byte REG_BINARY) = Specifically, Little-Endian
  42. Const cm_REG_DWORD_BIG_ENDIAN%                          = 5 ; 0x01020304 A 32-bit number (Can also be a 4-byte REG_BINARY) = Specifically, Big-Endian
  43. ;Const cm_REG_LINK%                                                     = 6 ; UNSUPPORTED!
  44. Const cm_REG_MULTI_SZ%                                          = 7 ; UTF-16 Not supported
  45. Const cm_REG_RESOURCE_LIST%                                     = 8 ; UNSUPPORTED!
  46. Const cm_REG_FULL_RESOURCE_DESCRIPTOR%          = 9 ; As Series of 4-Byte Valuyes expressed as String with | separator
  47. ;Const cm_REG_RESOURCE_REQUIREMENTS_LIST%               = 10; UNSUPPORTED!
  48. Const cm_REG_QWORD%                                                     = 11; Double-Length (64-Bit) Integer expressed as String
  49. Const cm_REG_QWORD_LITTLE_ENDIAN%                               = 11; Double-Length (64-Bit) Integer expressed as String
  50.  
  51. ; global var holding last error #
  52. Global gm_REG_LAST_ERROR                                                = cm_REG_ERROR_SUCCESS
  53.  
  54. ; Possibly useful constants
  55. Const cs_REG_SOFTWARE_SUBKEY$                                   ="SOFTWARE"
  56. Const cs_REG_HARDWARE_SUBKEY$                                   ="HARDWARE"
  57. Const cs_REG_SECURITY_SUBKEY$                                   ="SECURITY"
  58. Const cs_REG_SAM_SUBKEY$                                                ="SAM"
  59. Const cs_REG_SYSTEM_SUBKEY$                                     ="SYSTEM"
  60.  
  61. Const cs_REG_DEFAULT_VALUE$                                     ="(Default)"
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71. Function s_REG_EnumValues$(nRegKey%,sSubKey$,sDelim$="|",ntypes=False); enumerates the keys contained in the passed subkey and returns them as a delimited string in the format: KEY=VALUE|KEY=VALUE|KEY=VALUE
  72.         Local sRetVal$=""
  73.         Local sKey$=""
  74.         Local sVal$=""
  75.         Local mKeybank=CreateBank(100)
  76.         Local mKeybanksize=CreateBank(4)
  77.         Local mValbank=CreateBank(100)
  78.         Local mValbanksize=CreateBank(4)
  79.         Local mTypebank=CreateBank(4)
  80.         Local nChar=0
  81.         Local nIdx=0
  82.         Local nType=0
  83.        
  84.         ; open the key
  85.         Local hKey=REG_OpenKey(nRegKey,sSubKey$)
  86.         If (hKey<>cm_REG_INVALID_KEY)
  87.                 ; read in the values
  88.                 Repeat
  89.                         ; init the banks
  90.                         PokeInt(mTypebank,0,0)
  91.                         PokeInt(mValbanksize,0,100)
  92.                         PokeInt(mKeybanksize,0,100)
  93.                        
  94.                         ; clear out the temp values
  95.                         sKey$=""
  96.                         sVal$=""
  97.                        
  98.                         If (AdvApi32_RegEnumValue(hKey,nIdx,mKeybank,mKeybanksize,0,mTypebank,mValbank,mValbanksize)<>cm_REG_ERROR_EOF)
  99.                                 nType=PeekInt(mTypebank,0)
  100.                                
  101.                                 ; tack on the delimiter
  102.                                 If (sVal$<>"")
  103.                                         sVal$=sVal$+sDelim$
  104.                                 EndIf
  105.                                
  106.                                 ; build the key name
  107.                                 For nChar=0 To PeekInt(mKeybanksize,0)-1
  108.                                         If (Not (PeekByte(mValbank,nChar)))
  109.                                                 Exit
  110.                                         End If
  111.                                         sKey$=sKey$+Chr(PeekByte(mKeybank,nChar))
  112.                                 Next
  113.                                
  114.                                 Select (nType)
  115.                                         Case cm_REG_NONE:
  116.                                         ; Always as Binary
  117.                                                 For nChar=0 To PeekInt(mValbanksize,0)-1
  118.                                                         sVal$=sVal$+Chr(PeekByte(mValbank,nChar))
  119.                                                 Next
  120.                                         Case cm_REG_SZ:
  121.                                         ; ascii bytes until 0
  122.                                                 For nChar=0 To PeekInt(mValbanksize,0)-1
  123.                                                         If (Not (PeekByte(mValbank,nChar)))
  124.                                                                 Exit
  125.                                                         End If
  126.                                                         sVal$=sRetVal$+Chr(PeekByte(mValbank,nChar))
  127.                                                 Next
  128.                                         Case cm_REG_EXPAND_SZ:
  129.                                         ;We can retrieve the value if not the EXPANDED path
  130.                                                 For nChar=0 To PeekInt(mValbanksize,0)-1
  131.                                                         If (Not(PeekByte(mValbank,nChar)))
  132.                                                                 Exit
  133.                                                         End If
  134.                                                         sVal$=sVal$+Chr(PeekByte(mValbank,nChar))
  135.                                                 Next   
  136.                                                 sVal=REG_ExpandValue(sRetVal)
  137.                                         Case cm_REG_BINARY:
  138.                                         ; byte by byte
  139.                                                 For nChar=0 To PeekInt(mValbanksize,0)-1
  140.                                                 ;do not stop at chr(0)
  141.                                                         sVal$=sVal$+Chr(PeekByte(mValbank,nChar))
  142.                                                 Next
  143.                                         Case cm_REG_DWORD:
  144.                                         ; read in an integer
  145.                                                 sVal$=Str(PeekInt(mValbank,0))
  146.                                         Case cm_REG_DWORD_LITTLE_ENDIAN:
  147.                                         ; read in an integer
  148.                                                 sVal$=Str(PeekInt(mValbank,0)) 
  149.                                         Case cm_REG_DWORD_BIG_ENDIAN:
  150.                                         ; read in an integer
  151.                                                 Local n3=PeekByte(mValbank,0)
  152.                                                 Local n2=PeekByte(mValbank,1)
  153.                                                 Local n1=PeekByte(mValbank,2)
  154.                                                 Local n0=PeekByte(mValbank,3)
  155.                                                 sRetVal=Str(((n3 Shl 24)+(n2 Shl 16)+(n1 Shl 8)+n0))
  156.                                         Case cm_REG_MULTI_SZ:
  157.                                         ; build the value (ascii bytes)
  158.                                                 For nChar = 0 To PeekInt(mValbanksize, 0) - 1
  159.                                                 ;Do not stop at Chr(0)
  160.                                                         sVal = sVal + Chr(PeekByte(mValbank,nChar))
  161.                                                 Next
  162.                                         Case cm_REG_QWORD:
  163.                                                 For nChar=0 To PeekInt(mValbanksize,0)-1
  164.                                                 ;do not stop at chr(0)
  165.                                                         sVal$=sVal$+Chr(PeekByte(mValbank,nChar))
  166.                                                 Next
  167.                                         Case cm_REG_QWORD_LITTLE_ENDIAN:
  168.                                                 For nChar=0 To PeekInt(mValbanksize,0)-1
  169.                                                 ;do not stop at chr(0)
  170.                                                         sVal$=sVal$+Chr(PeekByte(mValbank,nChar))
  171.                                                 Next
  172.                                         Case cm_REG_FULL_RESOURCE_DESCRIPTOR:
  173.                                         ; Int by Int
  174.                                                 For nChar=0 To (PeekInt(mValbanksize,0)-1) Step 4
  175.                                                 ;do not stop at chr(0)
  176.                                                         sVal$=sRetVal$+Chr(PeekInt(mValbank,nChar))+"|"
  177.                                                 Next
  178.                                                 If (Right(sVal,1)="|")
  179.                                                         sVal=Left(sVal,Len(sVal)-1)
  180.                                                 End If
  181.                                 End Select
  182.                                
  183.                                 If (ntypes)
  184.                                         sRetVal$=(sRetVal$+PeekInt(mTypebank,0)+";"+sKey$+"="+sVal$)
  185.                                 Else
  186.                                         sRetVal$=(sRetVal$+sKey$+"="+sVal$)
  187.                                 EndIf
  188.                         Else
  189.                                 Exit
  190.                         EndIf                  
  191.                        
  192.                         nIdx=nIdx+1
  193.                 Forever
  194.                 REG_CloseKey(hKey)
  195.         EndIf
  196.        
  197.         FreeBank mTypebank
  198.         FreeBank mValbank
  199.         FreeBank mValbanksize
  200.         FreeBank mKeybank
  201.         FreeBank mKeybanksize
  202.        
  203.         Return sRetVal$
  204. End Function
  205.  
  206. Function s_REG_EnumKeys$(nRegKey%,sSubKey$,sDelim$="|"); enumerates the keys contained in the passed subkey and returns them as a delimited string in the format: KEY|KEY|KEY
  207.         Local sRetVal$=""
  208.         Local mKeybank=CreateBank(100)
  209.         Local nIdx=0
  210.         Local bExitLoop%=False
  211.         Local nChar
  212.        
  213.         ; open the key first   
  214.         Local hKey=REG_OpenKey(nRegKey,sSubKey$)
  215.         If (hKey<>cm_REG_INVALID_KEY)
  216.                 While (Not(bExitLoop%))                
  217.                         If (AdvApi32_RegEnumKey(hKey,nIdx,mKeybank,BankSize(mKeybank))<>cm_REG_ERROR_EOF)
  218.                                 ; tack on the delimiter
  219.                                 If (sRetVal$<>"")
  220.                                         sRetVal$=sRetVal$+sDelim$
  221.                                 EndIf
  222.                                
  223.                                 For nChar=0 To BankSize(mKeybank)-1
  224.                                         If (Not(PeekByte(mKeybank,nChar)))
  225.                                                 bExitLoop%=True
  226.                                                 Exit
  227.                                         End If
  228.                                         sRetVal$=sRetVal$+Chr(PeekByte(mKeybank,nChar))
  229.                                 Next
  230.                         Else
  231.                                 bExitLoop=True
  232.                                 Exit
  233.                         EndIf
  234.                        
  235.                         nIdx=nIdx+1
  236.                 Wend
  237.                 REG_CloseKey(hKey)
  238.         EndIf
  239.        
  240.         FreeBank mKeybank
  241.         Return sRetVal$
  242. End Function
  243.  
  244. Function nb_REG_DeleteValue%(nRegKey%,SubKey$,ValueName$); deletes a value from the registry.  returns True/False.
  245.         Local hKey=REG_OpenKey(nRegKey,SubKey$)
  246.         Local bRetVal=False
  247.         If (hKey<>cm_REG_INVALID_KEY)
  248.                 Local nRslt=AdvApi32_RegDeleteValue(hKey,ValueName$)           
  249.                 If (nRslt=cm_REG_ERROR_SUCCESS)
  250.                         bRetVal=True
  251.                 Else
  252.                         gm_REG_LAST_ERROR=nRslt
  253.                 EndIf
  254.                 REG_CloseKey(hKey)
  255.         EndIf
  256.         Return bRetVal
  257. End Function
  258.  
  259. Function REG_GetValue$(nRegKey%,sSubKey$,sValueName$,sDflt$="",nTypes=False); gets a value from the registry and returns it as a string.  will return the passed default if the value requested is not found in the registry.
  260.         Local sRetVal$=sDflt$
  261.         Local hKey=REG_OpenKey(nRegKey,sSubKey$)
  262.         Local nChar=0
  263.         Local nType=0
  264.        
  265.         ; open the key
  266.         If (hKey<>cm_REG_INVALID_KEY)
  267.                 Local mValbank=CreateBank(255)
  268.                 Local mValBankSize=CreateBank(4)
  269.                 Local mTypeBank=CreateBank(4)
  270.                
  271.                 ; init the banks
  272.                 PokeInt(mTypeBank,0,0)
  273.                 PokeInt(mValBankSize,0,0)
  274.                
  275.                 Local nRslt=AdvApi32_RegQueryValueEx(hKey,sValueName$,0,mTypeBank,mValbank,mValBankSize)
  276.                 If (nRslt=cm_REG_ERROR_MORE_DATA)
  277.                         ResizeBank mValbank,PeekInt(mValBankSize,0)
  278.                         nRslt=AdvApi32_RegQueryValueEx(hKey,sValueName$,0,mTypeBank,mValbank,mValBankSize)
  279.                 End If
  280.                 If (nRslt=cm_REG_ERROR_SUCCESS)
  281.                         sRetVal$=""
  282.                        
  283.                         nType=PeekInt(mTypeBank,0)
  284.                        
  285.                         ; build the value
  286.                         Select (nType)
  287.                                 Case cm_REG_NONE:
  288.                                         ; Always as Binary
  289.                                         For nChar=0 To PeekInt(mValBankSize,0)-1 Step 2
  290.                                                 ;do not stop at chr(0)
  291.                                                 sRetVal$=sRetVal$+Upper(Right(Hex((PeekByte(mValbank,nChar)) And 255),2))
  292.                                         Next
  293.                                 Case cm_REG_SZ:
  294.                                         ; ascii bytes until 0
  295.                                         For nChar=0 To PeekInt(mValBankSize,0)-1
  296.                                                 If (Not (PeekByte(mValbank,nChar)))
  297.                                                         Exit
  298.                                                 End If
  299.                                                 sRetVal$=sRetVal$+Chr(PeekByte(mValbank,nChar))
  300.                                         Next
  301.                                 Case cm_REG_EXPAND_SZ:
  302.                                         ;We can retrieve the value if not the EXPANDED path
  303.                                         For nChar=0 To PeekInt(mValBankSize,0)-1
  304.                                                 If (Not(PeekByte(mValbank,nChar)))
  305.                                                         Exit
  306.                                                 End If
  307.                                                 sRetVal$=sRetVal$+Chr(PeekByte(mValbank,nChar))
  308.                                         Next   
  309.                                         sRetVal=REG_ExpandValue(sRetVal)
  310.                                 Case cm_REG_BINARY:
  311.                                         ; byte by byte
  312.                                        
  313.                                         For nChar=0 To PeekInt(mValBankSize,0)-1; Step 2
  314.                                                 ;do not stop at chr(0)
  315.                                                 sRetVal$=sRetVal$+Chr(PeekByte(mValbank,nChar))
  316.                                         Next
  317.                                        
  318.                                 Case cm_REG_DWORD:
  319.                                         ; read in an integer
  320.                                         sRetVal$=Str(PeekInt(mValbank,0))
  321.                                 Case cm_REG_DWORD_LITTLE_ENDIAN:
  322.                                         ; read in an integer
  323.                                         sRetVal$=Str(PeekInt(mValbank,0))      
  324.                                 Case cm_REG_DWORD_BIG_ENDIAN:
  325.                                         ; read in an integer
  326.                                         Local n3=PeekByte(mValbank,0)
  327.                                         Local n2=PeekByte(mValbank,1)
  328.                                         Local n1=PeekByte(mValbank,2)
  329.                                         Local n0=PeekByte(mValbank,3)
  330.                                         sRetVal=Str(((n3 Shl 24)+(n2 Shl 16)+(n1 Shl 8)+n0))
  331.                                 Case cm_REG_MULTI_SZ:
  332.                                         ; build the value (ascii bytes)
  333.                                         For nChar = 0 To PeekInt(mValBankSize, 0) - 1
  334.                                                 ;Do not stop at Chr(0)
  335.                                                 sRetVal = sRetVal + Chr(PeekByte(mValbank,nChar))
  336.                                         Next
  337.                                 Case cm_REG_QWORD:
  338.                                         For nChar=0 To PeekInt(mValBankSize,0)-1
  339.                                                 ;do not stop at chr(0)
  340.                                                 sRetVal$=sRetVal$+Chr(PeekByte(mValbank,nChar))
  341.                                         Next
  342.                                 Case cm_REG_QWORD_LITTLE_ENDIAN:
  343.                                         For nChar=0 To PeekInt(mValBankSize,0)-1
  344.                                                 ;do not stop at chr(0)
  345.                                                 sRetVal$=sRetVal$+Chr(PeekByte(mValbank,nChar))
  346.                                         Next
  347.                                 Case cm_REG_FULL_RESOURCE_DESCRIPTOR:
  348.                                         ; Int by Int
  349.                                         For nChar=0 To (PeekInt(mValBankSize,0)-1) Step 4
  350.                                                 ;do not stop at chr(0)
  351.                                                 sRetVal$=sRetVal$+Chr(PeekInt(mValbank,nChar))+"|"
  352.                                         Next
  353.                                         If (Right(sRetVal,1)="|")
  354.                                                 sRetVal=Left(sRetVal,Len(sRetVal)-1)
  355.                                         End If
  356.                         End Select
  357.                        
  358.                         ; tack on the type if requested
  359.                         If (nTypes)
  360.                                 sRetVal$=Str(nType)+";"+sRetVal$
  361.                         EndIf
  362.                 Else
  363.                         gm_REG_LAST_ERROR=nRslt
  364.                 EndIf
  365.                 REG_CloseKey(hKey)
  366.         EndIf
  367.         Return sRetVal$
  368. End Function
  369.  
  370. Function REG_SetValue%(nRegKey%,sSubKey$,sValueName$,sValue$,nType=cm_REG_SZ); sets a value in the registry.  defaults to type string, but can pass REG_DWORD and REG_BINARY. returns True/False.
  371.         Local hKey=REG_OpenKey(nRegKey,sSubKey$)
  372.         Local bRetVal=False
  373.         If (hKey<>cm_REG_INVALID_KEY)
  374.                 Local mValbank
  375.                 Local i
  376.                 ; create a bank to hold the info
  377.                 Select nType
  378.                         Case cm_REG_NONE:
  379.                                 ;Typically 0-Length
  380.                                 mValbank=CreateBank(Len(sValue$))
  381.                                 If (sValue<>"")
  382.                                         For i=1 To Len(sValue$)
  383.                                                 PokeByte(mValbank,i-1,Asc(Mid(sValue$,i,1)))
  384.                                         Next
  385.                                 End If
  386.                         Case cm_REG_SZ:
  387.                                 mValbank=CreateBank(Len(sValue$))
  388.                                 For i=1 To Len(sValue$)
  389.                                         PokeByte(mValbank,i-1,Asc(Mid(sValue$,i,1)))
  390.                                 Next
  391.                         Case cm_REG_BINARY:
  392.                                 mValbank=CreateBank(Len(sValue$))
  393.                                 For i=1 To Len(sValue$)
  394.                                         PokeByte(mValbank,i-1,Asc(Mid(sValue$,i,1)))
  395.                                 Next                   
  396.                         Case cm_REG_DWORD:
  397.                                 mValbank=CreateBank(4)
  398.                                 PokeInt(mValbank,0,Int(sValue$))
  399.                         Case cm_REG_DWORD_LITTLE_ENDIAN:
  400.                                 mValbank=CreateBank(4)
  401.                                 For i= 3 To 0 Step -1
  402.                                         PokeByte(mValbank,i,Asc(Mid(sValue$,3-i,1)))
  403.                                 Next
  404.                         Case cm_REG_DWORD_BIG_ENDIAN:
  405.                                 mValbank=CreateBank(4)
  406.                                 PokeInt(mValbank,0,Int(sValue$))       
  407.                         Case cm_REG_EXPAND_SZ:
  408.                                 mValbank=CreateBank(Len(sValue$))
  409.                                 For i=1 To Len(sValue$)
  410.                                         PokeByte(mValbank,i-1,Asc(Mid(sValue$,i,1)))
  411.                                 Next   
  412.                         Case cm_REG_MULTI_SZ:
  413.                                 mValbank=CreateBank(Len(sValue$))
  414.                                 For i=1 To Len(sValue$)
  415.                                         PokeByte(mValbank,i-1,Asc(Mid(sValue$,i,1)))
  416.                                 Next   
  417.                         Case cm_REG_QWORD:
  418.                                 mValbank=CreateBank(Len(sValue$))
  419.                                 For i=1 To Len(sValue$)
  420.                                         PokeByte(mValbank,i-1,Asc(Mid(sValue$,i,1)))
  421.                                 Next           
  422.                         Case cm_REG_QWORD_LITTLE_ENDIAN:
  423.                                 mValbank=CreateBank(Len(sValue$))
  424.                                 For i=1 To Len(sValue$)
  425.                                         PokeByte(mValbank,i-1,Asc(Mid(sValue$,i,1)))
  426.                                 Next
  427.                         Case cm_REG_FULL_RESOURCE_DESCRIPTOR:
  428.                                 ; Int by Int
  429.                                 If (Right(sValue,1)="|")
  430.                                         sValue=Left(sValue,Len(sValue)-1)
  431.                                 End If
  432.                                 mValbank=CreateBank(Len(sValue$))
  433.                                 For i=1 To Len(sValue) Step 4
  434.                                                 ;do not stop at chr(0)
  435.                                         PokeInt mValbank,i,Int(Mid(sValue,i,4))
  436.                                 Next
  437.                 End Select
  438.                
  439.                 Local nRslt=AdvApi32_RegSetValueEx(hKey,sValueName$,0,nType,mValbank,BankSize(mValbank))
  440.                 If (nRslt=cm_REG_ERROR_SUCCESS)
  441.                         bRetVal=True
  442.                 Else
  443.                         gm_REG_LAST_ERROR=nRslt
  444.                 EndIf
  445.                 REG_CloseKey(hKey)
  446.         EndIf
  447.         Return bRetVal
  448. End Function
  449.  
  450. Function REG_DeleteKey%(nRegKey%,sKeyName$); deletes the passed key from the registry.  returns True/False.
  451.         gm_REG_LAST_ERROR=cm_REG_ERROR_SUCCESS
  452.         Local nRslt=AdvApi32_RegDeleteKey(nRegKey,sKeyName$)
  453.        
  454.         If (nRslt<>cm_REG_ERROR_SUCCESS)
  455.                 gm_REG_LAST_ERROR=nRslt
  456.         Else
  457.                 Local sSubKeys$ = s_REG_EnumKeys(nRegKey%, sKeyName$)
  458.                 While (Len(sSubKeys$))
  459.                         If (Instr(sSubKeys$,Chr(13)))
  460.                                 REG_DeleteKey(nRegKey%, sKeyName$+""+Left(sSubKeys$,Instr(sSubKeys$,Chr(13))-1))
  461.                                 sSubKeys$ = Mid(sSubKeys$,Instr(sSubKeys$,Chr(13))+1)
  462.                         Else
  463.                                 REG_DeleteKey(nRegKey%, sKeyName$+""+sSubKeys$)
  464.                                 Exit
  465.                         End If
  466.                 Wend
  467.         End If
  468.         Return (nRslt=cm_REG_ERROR_SUCCESS)
  469. End Function
  470.  
  471. Function REG_CreateKey%(nRegKey%,sKeyName$); returns the registry handle or -1 if failed.
  472.         gm_REG_LAST_ERROR=cm_REG_ERROR_SUCCESS
  473.         Local mRegbank=CreateBank(4)
  474.         Local hKey=cm_REG_INVALID_KEY
  475.        
  476.         Local nRslt=AdvApi32_RegCreateKey(nRegKey%,sKeyName$,mRegbank)
  477.        
  478.         If (nRslt=cm_REG_ERROR_SUCCESS)
  479.                 hKey=PeekInt(mRegbank,0)
  480.         Else
  481.                 gm_REG_LAST_ERROR=nRslt
  482.         EndIf
  483.        
  484.         FreeBank mRegbank
  485.         Return hKey
  486. End Function
  487.  
  488. Function REG_OpenKey%(nRegKey%,sKeyName$); returns the registry handle or -1 if failed
  489.         Local mRegbank=CreateBank(4)
  490.         Local hKey=cm_REG_INVALID_KEY
  491.        
  492.         Local nRslt=AdvApi32_RegOpenKey(nRegKey%,sKeyName$,mRegbank)
  493.        
  494.         If (nRslt=cm_REG_ERROR_SUCCESS)
  495.                 hKey=PeekInt(mRegbank,0)
  496.         Else
  497.                 gm_REG_LAST_ERROR=nRslt
  498.         EndIf
  499.        
  500.         FreeBank mRegbank
  501.         Return hKey
  502. End Function
  503.  
  504. Function REG_CloseKey%(hRegKey%); closes the registry key.  returns True/False.
  505.         Local nRslt=AdvApi32_RegCloseKey(hRegKey)
  506.        
  507.         If (gm_REG_LAST_ERROR=cm_REG_ERROR_SUCCESS)
  508.                 If (nRslt<>cm_REG_ERROR_SUCCESS)
  509.                         gm_REG_LAST_ERROR=nRslt
  510.                         Return False
  511.                 End If 
  512.         EndIf
  513.        
  514.         Return True
  515. End Function
  516.  
  517. Function REG_IsKey%(nRegKey%,sKeyName$); returns True if the key exists
  518.         Local hKey=REG_OpenKey(nRegKey,sKeyName$)
  519.         Local bRetVal=False
  520.        
  521.         If (hKey<>cm_REG_INVALID_KEY)
  522.                 REG_CloseKey(hKey)
  523.                 bRetVal=True
  524.         EndIf
  525.        
  526.         Return bRetVal
  527. End Function
  528.  
  529. Function REG_ExpandValue$(sValue$)
  530.         ;Remove FilePath Quote marks
  531.         If (Left(sValue,1)=Chr(34))
  532.                 Local Close=Instr(sValue,Chr(34),2)
  533.                 If (Not(Close))
  534.                         sValue=Right(sValue,Len(sValue)-1)
  535.                 Else
  536.                         Local sLine$=Right(sValue,Len(sValue)-Close)
  537.                         sValue=Replace(Left(sValue,Close),Chr(34),"")+sLine
  538.                 End If
  539.         End If
  540.        
  541.         If (Instr(sValue,"\"))
  542.                 ;NOT network paths
  543.                 If (Left(sValue,2)<>"\")
  544.                         ;NOT URL Paths
  545.                         If (Not(Instr(sValue,":\")))
  546.                                 sValue=Replace(sValue,"\","")
  547.                         End If
  548.                 End If
  549.         Else
  550.                 sValue=Replace(sValue,"/","")
  551.         End If
  552.        
  553.         If (Left(sValue,1)="@")
  554.                 ;Ignore MountPoint derivations
  555.                 sValue=Replace(sValue,"@","")
  556.         End If
  557.        
  558.         ;Obtain expanded Environment Vars or System Props
  559.         If (Left(sValue,1)="%")
  560.                 Local EndEnv=Instr(sValue,"%",2)
  561.                 Local EnvName$=Upper(Mid(sValue,2,EndEnv-2))
  562.                 Local Env$=GetEnv(EnvName)
  563.                 If (Env="")
  564.                         Env=SystemProperty(EnvName)
  565.                 End If
  566.                 If (Env<>"")
  567.                         sValue=Env+Right(sValue,Len(sValue)-EndEnv)
  568.                 End If
  569.         End If
  570.        
  571.         Return sValue
  572. End Function


Comments :


virtlands(Posted 1+ years ago)

 I downloaded it. Shall use it for registry stuff. Thankx.


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal