Registry

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Registry

Beitrag von Thomas »

Hallo,
ich weiß es gibt schon viele Themen über die Registry im Forum aber leider haben die meine Frage nicht ganz beantwortet ...

Ich möchte ein Programm schreiben, dass in der Registry unter dem Pfad HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main den Inhalt der Zeichenfolge Window Title ändert, bzw. sogar die Zeichenfolge erstellt falls sie noch nicht vorhanden ist.
Wie ist das möglich?
v6.00
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Beitrag von sibru »

Auslesen String aus Registry:

Code: Alles auswählen

Value$ = Reg_GetValue (#hkey_local_machine,<dein RegPfad ohne führendes hkey_localc_machine>, <dein RegKey>)

Schreiben String in Registry:

Code: Alles auswählen

  If Reg_CreateKey (#hkey_local_machine, <dein RegPfad>, <dein RegKey>, "") 
    Reg_SetValue (#hkey_local_machine, <dein RegPfad>, <dein RegKey>, <neuer Wert$>,#REG_SZ, "") 
  endif




falls ....\PureBasic\Include\Registry.PBI nicht installiert ist (steckt in jaPBe, glaub´ ich), brauchste noch folgenden Code:

Code: Alles auswählen

;Read and change the Registry / FileAssociate
;#PB_Lit2Msg stop
Procedure Reg_SetValue(topKey, sKeyName.s, sValueName.s, vValue.s, lType, ComputerName.s) 
   lpData.s 
   If Left(sKeyName, 1) = "\" : sKeyName = Right(sKeyName, Len(sKeyName) - 1) : EndIf 
   If Right(sKeyName,1)="\" : sKeyName = Left(sKeyName, Len(sKeyName) - 1) : EndIf 
   If ComputerName = "" 
      GetHandle = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
   Else 
      lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry) 
      GetHandle = RegOpenKeyEx_(lhRemoteRegistry, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
   EndIf 
   If GetHandle = #ERROR_SUCCESS 
      lpcbData = 255 
      lpData = Space(255) 
      Select lType 
         Case #REG_SZ 
            GetHandle = RegSetValueEx_(hKey, sValueName, 0, #REG_SZ, @vValue, Len(vValue) + 1) 
         Case #REG_DWORD 
            lValue = Val(vValue) 
            GetHandle = RegSetValueEx_(hKey, sValueName, 0, #REG_DWORD, @lValue, 4) 
      EndSelect 
      RegCloseKey_(hKey) 
      ergebnis = 1 
      ProcedureReturn ergebnis 
   Else 
      MessageRequester("Fehler", "Ein Fehler ist aufgetreten", 0) 
      RegCloseKey_(hKey) 
      ergebnis = 0 
      ProcedureReturn ergebnis 
   EndIf 
EndProcedure 


Procedure.s Reg_GetValue(topKey, sKeyName.s, sValueName.s, ComputerName.s) 
   lpData.s 
   GetValue.s =""
   If Left(sKeyName, 1) = "\" : sKeyName = Right(sKeyName, Len(sKeyName) - 1) : EndIf 
   If Right(sKeyName,1)="\" : sKeyName = Left(sKeyName, Len(sKeyName) - 1) : EndIf 
   If ComputerName = "" 
      GetHandle = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
   Else 
      lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry) 
      GetHandle = RegOpenKeyEx_(lhRemoteRegistry, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
   EndIf 
   If GetHandle = #ERROR_SUCCESS 
      lpcbData = 255 
      lpData = Space(255) 
      GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpData, @lpcbData) 
      If GetHandle = #ERROR_SUCCESS 
         Select lType 
            Case #REG_SZ 
               GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lType, @lpData, @lpcbData) 
               If GetHandle = 0 
                  GetValue = Left(lpData, lpcbData - 1) 
               Else 
                  GetValue = "" 
               EndIf 
            Case #REG_DWORD 
               GetHandle = RegQueryValueEx_(hKey, sValueName, 0, @lpType, @lpDataDWORD, @lpcbData) 
               If GetHandle = 0 
                  GetValue = Str(lpDataDWORD) 
               Else 
                  GetValue = "0" 
               EndIf 
         EndSelect
      Else : Debug "!!! RegError: read <"+sKeyName+"> / <"+sValueName+">"
      EndIf
   Else : Debug "!!! RegError: open <"+sKeyName+">"
   EndIf 
   RegCloseKey_(hKey) 
   ProcedureReturn GetValue 
EndProcedure 


Procedure.s Reg_ListSubKey(topKey, sKeyName.s, Index, ComputerName.s) 
   lpName.s 
   lpftLastWriteTime.FILETIME 
   If Left(sKeyName, 1) = "\" : sKeyName = Right(sKeyName, Len(sKeyName) - 1) :EndIf 
   If Right(sKeyName,1)="\" : sKeyName = Left(sKeyName, Len(sKeyName) - 1) : EndIf 
  
   If ComputerName = "" 
      GetHandle = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
   Else 
      lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry) 
      GetHandle = RegOpenKeyEx_(lhRemoteRegistry, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
   EndIf 
   If GetHandle = #ERROR_SUCCESS 
      lpcbName = 255 
      lpName = Space(255) 
      GetHandle = RegEnumKeyEx_(hKey, Index, @lpName, @lpcbName, 0, 0, 0, @lpftLastWriteTime) 
      If GetHandle = #ERROR_SUCCESS 
         ListSubKey.s = Left(lpName, lpcbName) 
      Else 
         ListSubKey.s = "" 
      EndIf 
   EndIf 
   RegCloseKey_(hKey) 
   ProcedureReturn ListSubKey 
EndProcedure 


Procedure Reg_DeleteValue(topKey, sKeyName.s, sValueName.s, ComputerName.s) 
   If Left(sKeyName, 1) = "\" : sKeyName = Right(sKeyName, Len(sKeyName) - 1) : EndIf 
   If Right(sKeyName,1)="\" : sKeyName = Left(sKeyName, Len(sKeyName) - 1) : EndIf 
   If ComputerName = "" 
      GetHandle = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
   Else 
      lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry) 
      GetHandle = RegOpenKeyEx_(lhRemoteRegistry, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
   EndIf 
   If GetHandle = #ERROR_SUCCESS 
      GetHandle = RegDeleteValue_(hKey, @sValueName) 
      If GetHandle = #ERROR_SUCCESS 
         DeleteValue = #True 
      Else 
         DeleteValue = #False 
      EndIf 
   EndIf 
   RegCloseKey_(hKey) 
   ProcedureReturn DeleteValue 
EndProcedure 


Procedure Reg_CreateKey(topKey, sKeyName.s, ComputerName.s) 
   lpSecurityAttributes.SECURITY_ATTRIBUTES 
   If Left(sKeyName, 1) = "\" : sKeyName = Right(sKeyName, Len(sKeyName) - 1) :EndIf 
   If Right(sKeyName,1)="\" : sKeyName = Left(sKeyName, Len(sKeyName) - 1) : EndIf 
   If ComputerName = "" 
      GetHandle = RegCreateKeyEx_(topKey, sKeyName, 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, @lpSecurityAttributes, @hNewKey, @GetHandle) 
   Else 
      lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry) 
      GetHandle = RegCreateKeyEx_(lhRemoteRegistry, sKeyName, 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, @lpSecurityAttributes, @hNewKey, @GetHandle) 
   EndIf 
   If GetHandle = #ERROR_SUCCESS 
      GetHandle = RegCloseKey_(hNewKey) 
      CreateKey = #True 
   Else 
      CreateKey = #False 
   EndIf 
   ProcedureReturn CreateKey 
EndProcedure 


Procedure Reg_DeleteKey(topKey, sKeyName.s, ComputerName.s) 
   If Left(sKeyName, 1) = "\" : sKeyName = Right(sKeyName, Len(sKeyName) - 1) : EndIf 
   If Right(sKeyName,1)="\" : sKeyName = Left(sKeyName, Len(sKeyName) - 1) : EndIf 
   If ComputerName = "" 
      GetHandle = RegDeleteKey_(topKey, @sKeyName) 
   Else 
      lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry) 
      GetHandle = RegDeleteKey_(lhRemoteRegistry, @sKeyName) 
   EndIf 
   If GetHandle = #ERROR_SUCCESS 
      DeleteKey = #True 
   Else 
      DeleteKey = #False 
   EndIf 
   ProcedureReturn DeleteKey 
EndProcedure 


Procedure.s Reg_ListSubValue(topKey, sKeyName.s, Index, ComputerName.s) 
   lpName.s 
   lpftLastWriteTime.FILETIME 
   ListSubValue.s 
   If Left(sKeyName, 1) = "\" : sKeyName = Right(sKeyName, Len(sKeyName) - 1) : EndIf 
   If Right(sKeyName,1)="\" : sKeyName = Left(sKeyName, Len(sKeyName) - 1) : EndIf 
   If ComputerName = "" 
      GetHandle = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
   Else 
      lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry) 
      GetHandle = RegOpenKeyEx_(lhRemoteRegistry, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
   EndIf 
   
   
   If GetHandle = #ERROR_SUCCESS 
      lpcbName = 255 
      lpName = Space(255) 
      GetHandle = RegEnumValue_(hKey, Index, @lpName, @lpcbName, 0, 0, 0, 0) 
      If GetHandle = #ERROR_SUCCESS 
         ListSubValue = Left(lpName, lpcbName) 
      Else 
         ListSubValue = "" 
      EndIf 
      RegCloseKey_(hKey) 
   EndIf 
   ProcedureReturn ListSubValue 
EndProcedure 


Procedure Reg_KeyExists(topKey, sKeyName.s, ComputerName.s) 
   
   If Left(sKeyName, 1) = "\" : sKeyName = Right(sKeyName, Len(sKeyName) - 1) : EndIf 
   If Right(sKeyName,1)="\" : sKeyName = Left(sKeyName, Len(sKeyName) - 1) : EndIf 
   
   If ComputerName = "" 
      GetHandle = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
   Else 
      lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry) 
      GetHandle = RegOpenKeyEx_(lhRemoteRegistry, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
   EndIf 
   
   If GetHandle = #ERROR_SUCCESS 
      KeyExists = #True 
   Else 
      KeyExists = #False 
   EndIf 
   ProcedureReturn KeyExists 
EndProcedure 


Procedure Reg_DeleteKeyWithAllSub(topKey,sKeyName.s,ComputerName.s)
   i=0
   a$=""
   Repeat
      b$=a$
      a$=Reg_ListSubKey(topKey,sKeyName,0,"")
      If a$<>""
         Reg_DeleteKeyWithAllSub(topKey,sKeyName+"\"+a$,"")
      EndIf
   Until a$=b$
   Reg_DeleteKey(topKey, sKeyName, ComputerName) 
EndProcedure


Procedure Reg_CreateKeyValue(topKey,sKeyName.s,sValueName.s,vValue.s,lType,ComputerName.s)
   Reg_CreateKey(topKey,sKeyName,ComputerName)
   ProcedureReturn Reg_SetValue(topKey,sKeyName,sValueName,vValue,lType,ComputerName)
EndProcedure


Procedure AssociateFileEx(AF_Ext$,ext_description$,programm$,icon$,prgkey$,cmd_description$,cmd_key$) 
   cmd$=Chr(34)+programm$+Chr(34)+" "+Chr(34)+"%1"+Chr(34) 
   If GetVersion_() & $FF0000 ; Windows NT/XP 
      Reg_CreateKeyValue(#HKEY_CLASSES_ROOT, "Applications\"+prgkey$+"\shell\"+cmd_description$+"\command","",cmd$,#REG_SZ,"") 
      If ext_description$ 
         Key$=AF_Ext$+"_auto_file" 
         Reg_CreateKeyValue(#HKEY_CLASSES_ROOT  ,"."+AF_Ext$           ,"",Key$            ,#REG_SZ,"") 
         Reg_CreateKeyValue(#HKEY_CLASSES_ROOT  ,Key$               ,"",ext_description$,#REG_SZ,"") 
         If icon$ 
            Reg_CreateKeyValue(#HKEY_CLASSES_ROOT,Key$+"\DefaultIcon","",icon$           ,#REG_SZ,"") 
         EndIf 
      EndIf 
      Reg_CreateKeyValue(#HKEY_CURRENT_USER,"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\."+AF_Ext$,"Application",prgkey$,#REG_SZ,"") 
   Else ;Windows 9x 
      Reg_CreateKeyValue(#HKEY_LOCAL_MACHINE  ,"Software\Classes\."+AF_Ext$                     ,"",prgkey$         ,#REG_SZ,"") 
      If ext_description$ 
         Reg_CreateKeyValue(#HKEY_LOCAL_MACHINE,"Software\Classes\"+prgkey$                   ,"",ext_description$,#REG_SZ,"") 
      EndIf 
      If icon$ 
         Reg_CreateKeyValue(#HKEY_LOCAL_MACHINE,"Software\Classes\"+prgkey$+"\DefaultIcon"    ,"",icon$           ,#REG_SZ,"") 
      EndIf 
      If cmd_description$<>cmd_key$ 
         Reg_CreateKeyValue(#HKEY_LOCAL_MACHINE,"Software\Classes\"+prgkey$+"\shell\"+cmd_key$,"",cmd_description$,#REG_SZ,"") 
      EndIf 
      Reg_CreateKeyValue(#HKEY_LOCAL_MACHINE  ,"Software\Classes\"+prgkey$+"\shell\"+cmd_key$+"\command","",cmd$,#REG_SZ,"") 
   EndIf 
EndProcedure 


Procedure Remove_AssociateFile(AF_Ext$,prgkey$) 
   If GetVersion_() & $FF0000 ; Windows NT/XP 
      Reg_DeleteKeyWithAllSub(#HKEY_CLASSES_ROOT,"Applications\"+prgkey$,"")
      key$=AF_Ext$+"_auto_file" 
      Reg_DeleteKeyWithAllSub(#HKEY_CLASSES_ROOT,"."+AF_Ext$,"")
      Reg_DeleteKeyWithAllSub(#HKEY_CLASSES_ROOT,key$,"")
      Reg_DeleteKeyWithAllSub(#HKEY_CURRENT_USER,"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\."+AF_Ext$,"") 
   Else ;Windows 9x 
      Reg_DeleteKeyWithAllSub(#HKEY_LOCAL_MACHINE  ,"Software\Classes\."+AF_Ext$,"")
      Reg_DeleteKeyWithAllSub(#HKEY_LOCAL_MACHINE,"Software\Classes\"+prgkey$,"")
   EndIf 
EndProcedure 


Procedure AssociateFile(AF_Ext$,ext_description$,programm$,icon$) 
   AssociateFileEx(AF_Ext$,ext_description$,programm$,icon$,GetFilePart(programm$),"open","open") 
EndProcedure 
;#PB_Lit2Msg start
viel Erfolg...


Siggi
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

Wieso postest du das doppelt?

Geht das auch kürzer?
v6.00
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

jo ^^

das was du nur brauchst ist:

Code: Alles auswählen

; Liest eine Variable aus der Registrierung aus 
; HKEY = #HKEY_LOCAL_MACHINE
;        #HKEY_CURRENT_USER
Procedure.s ReadReg(HKEY, Ort$, Var$)
 RetVal = RegOpenKeyEx_(HKEY, Ort$, 0, #KEY_ALL_ACCESS, @lhkey) 
 cch = 255 : sValue$ = Space(255) 
 lType = #REG_SZ 
 lrc = RegQueryValueEx_(lhkey, Var$, 0, @lType, @sValue$, @cch)   
 RegCloseKey_(lhkey) 
 ProcedureReturn sValue$
EndProcedure

; Schreibt eine Variable in die Registrierung 
Procedure WriteReg(HKEY, Ort$, Var$, String$)
 RegCreateKeyEx_(HKEY, Ort$, 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo)
 RegSetValueEx_(NewKey, Var$, 0, #REG_SZ, String$, Len(String$)+1)
 RegCloseKey_(NewKey)
EndProcedure
für dein Fall:

Code: Alles auswählen

LaberLaber$ = ReadReg(#HKEY_CURRENT_USER, Software\Microsoft\Internet Explorer\Main, WindowTitle)
WriteReg(#HKEY_CURRENT_USER, Software\Microsoft\Internet Explorer\Main, WindowTitle, "Laber Laber")
Du musst vllt noch mal die Variablen anpassen ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

Und was ist der Rest? :oops:
v6.00
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

andere nützliche befehle, wie Eiträge auflistem, Einträge ganz löschen, ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Die Registry.pbi ist ganz schön Bugy.

Teilweise falsche Variablen übergeben, keine Überprüfung ob Remote erfolgreich durgeführt wurde, diverse Handle werden nicht wieder freigegeben.

Keine Varablen deklariert, ungenaue Fehlerauswertung.

Summaru: Nicht entfehlenswert

Überarbeite gerade den Ganzen Code
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

Code: Alles auswählen

Procedure.s ReadReg(HKEY, Ort$, Var$) 
 RetVal = RegOpenKeyEx_(HKEY, Ort$, 0, #KEY_ALL_ACCESS, @lhkey) 
 cch = 255 : sValue$ = Space(255) 
 lType = #REG_SZ 
 lrc = RegQueryValueEx_(lhkey, Var$, 0, @lType, @sValue$, @cch)    
 RegCloseKey_(lhkey) 
 ProcedureReturn sValue$ 
EndProcedure 

Procedure WriteReg(HKEY, Ort$, Var$, String$) 
 RegCreateKeyEx_(HKEY, Ort$, 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_ALL_ACCESS, 0, @NewKey, @KeyInfo) 
 RegSetValueEx_(NewKey, Var$, 0, #REG_SZ, String$, Len(String$)+1) 
 RegCloseKey_(NewKey) 
EndProcedure 

Debug ReadReg(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\Main", "Window Title") 
WriteReg(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\Main", "Window Title", "Laber Laber")
Debug ReadReg(#HKEY_CURRENT_USER, "Software\Microsoft\Internet Explorer\Main", "Window Title") 
Das klappt schon mal ganz gut ... Danke :D

Wird da auch ein Schlüssel (oder wie man die Dinger nennt) erstellt, wenn er nicht vorhanden ist?
Wie kann ich so nen Schlüssel wieder löschen?
v6.00
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ja er wird erstellt wenn er nicht vorhanden ist, das macht diese Konstante:
#KEY_ALL_ACCESS

(glaube ich ^^)

kA ^^ einfach mal testen
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Thomas
Beiträge: 893
Registriert: 06.07.2006 19:24
Wohnort: Regensburg
Kontaktdaten:

Beitrag von Thomas »

"Einfach mal Testen" tu ich in der Reg noch garnix.
Dazu kenn ich mich zu wenig mit der aus :oops:
v6.00
Antworten