  | 
					
						Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!   
						
						
					 | 
				 
			 
			 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	 
	
	
		| Autor | 
		Nachricht | 
	 
	
		oldirty
 
  
  Anmeldungsdatum: 04.08.2005 Beiträge: 65
 
  | 
		
			
				 Verfasst am: 04.05.2006, 21:55    Titel: Registrywerte per APIs auslesen, wie? | 
				     | 
			 
			
				
  | 
			 
			
				Hallo, bin auf der Suche, Registry-Werte auszulesen, OHNE externe Programmaufrufe wie shell regedit... oder ähnliches, also direkt über APIs.
 
 
Habe auch einen Code gefunden, dieser liest, wenn ich das richtig verstehe, nur Strings:
 
 	  | Code: | 	 		  
 
'http://www.freebasic.net/forum/viewtopic.php?t=2293
 
screen 18
 
Option Explicit 
 
 
#include "windows.bi" 
 
#inclib "advapi32"
 
 
#define HKEY_CLASSES_ROOT  &H80000000 
 
#define HKEY_CURRENT_CONFIG  &H80000005 
 
#define HKEY_CURRENT_USER  &H80000001 
 
#define HKEY_DYN_DATA  &H80000006 
 
#define HKEY_LOCAL_MACHINE  &H80000002 
 
#define HKEY_PERFORMANCE_DATA  &H80000004 
 
#define HKEY_USERS  &H80000003 
 
 
dim shared root as hkey
 
Sub myRegGetStr(root As HKEY, sub_ As ZString ptr, name_ As ZString ptr, out_ As ZString ptr) 
 
  Dim hKey_ As HKEY 
 
    If RegOpenKeyEx(root, sub_, 0, KEY_READ, @hKey_) = ERROR_SUCCESS Then 
 
        Dim l As DWORD = 512 
 
        Dim t As DWORD 
 
        If RegQueryValueEx(hKey_, name_, NULL, @t, out_, @l) <> ERROR_SUCCESS OR (t <> REG_SZ AND t <> REG_EXPAND_SZ) Then Exit Sub 
 
        out_[512 - 1] = 0 
 
        RegCloseKey(hKey_) 
 
    End If 
 
End Sub 
 
 
Sub myRegSetStr(root As HKEY, sub_ As ZString ptr, name_ As ZString ptr, in_ As ZString ptr) 
 
  Dim hKey_ As HKEY 
 
    RegCreateKeyEx(root,sub_,0,0,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,@hKey_,0) 
 
    RegSetValueEx(hKey_,name_,0,REG_SZ,in_,Len(*in_)+1) 
 
    RegCloseKey(hKey_) 
 
End Sub 
 
 
Dim test As ZString * 1024 
 
 
'Wert schreiben
 
myRegSetStr(HKEY_LOCAL_MACHINE,"SOFTWARE\Yetifoot\Test", "HELLO", "Blah Blah") 
 
 
test = "" 
 
 
'Wert auslesen
 
dim shared key as long
 
myRegGetStr(HKEY_LOCAL_MACHINE,"SOFTWARE\Yetifoot\Test", "HELLO", @test) 
 
 
Print test 
 
 
Sleep
 
 | 	  
 
 
Hier nun meine Fragen:
 
1. Wie kann ich auch DWords aus der Registry auslesen?
 
2. Bekomme folgende Fehlermeldung (FBIDE 0.4.6):
 
 	  | Zitat: | 	 		  
 
...
 
Compiler output:
 
H:/FreeBASIC/examples/_Eigene/Speicher/FBIDETEMP.bas(3  : warning level 0: Passing scalar as pointer, at parameter 1 (root) of MYREGSETSTR()
 
H:/FreeBASIC/examples/_Eigene/Speicher/FBIDETEMP.bas(44) : warning level 0: Passing scalar as pointer, at parameter 1 (root) of MYREGGETSTR()
 
...
 
 | 	  
 
 
Das Programm läuft, es wird auch der Wert (REG_SZ) "Blah Blah" ausgegeben, micht stört aber die Meldung "level 0: Passing scalar as pointer, at parameter 1 (root)", wie muss ich den Code ändern?
 
 
Danke im Voraus
 
 
CU
 
OlDirty | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ytwinky
 
  
  Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
  | 
		
			
				 Verfasst am: 05.05.2006, 16:59    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Hi oldirty,
 
hab mich leider verpostet:
 
http://forum.qbasic.at/viewtopic.php?p=29277#29277
 
Kuckmal da nach
 
Gruß
 
ytwinky _________________
  	  | v1ctor hat Folgendes geschrieben: | 	 		  | Yeah, i like INPUT$(n) as much as PRINT USING.. | 	  ..also ungefähr so, wie ich GOTO.. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		oldirty
 
  
  Anmeldungsdatum: 04.08.2005 Beiträge: 65
 
  | 
		
			
				 Verfasst am: 05.05.2006, 17:59    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Problem 1 ist gelöst:
 
 
 	  | Code: | 	 		  
 
'http://www.freebasic.net/forum/viewtopic.php?t=2293
 
screen 18
 
Option Explicit 
 
 
#include "windows.bi" 
 
#inclib "advapi32"
 
 
#define HKEY_CLASSES_ROOT  &H80000000 
 
#define HKEY_CURRENT_CONFIG  &H80000005 
 
#define HKEY_CURRENT_USER  &H80000001 
 
#define HKEY_DYN_DATA  &H80000006 
 
#define HKEY_LOCAL_MACHINE  &H80000002 
 
#define HKEY_PERFORMANCE_DATA  &H80000004 
 
#define HKEY_USERS  &H80000003 
 
 
Dim shared RegVal As ZString * 1024 
 
 
dim shared root as hkey
 
Sub myRegGetStr(root As HKEY, sub_ As ZString ptr, name_ As ZString ptr, out_ As ZString ptr) 
 
  Dim hKey_ As HKEY 
 
  dim as long rc,KeyValType
 
  Dim KeyData As Long
 
    If RegOpenKeyEx(root, sub_, 0, KEY_READ, @hKey_) = ERROR_SUCCESS Then 
 
        Dim l As DWORD = 512 
 
        Dim t As DWORD 
 
        If RegQueryValueEx(hKey_, name_, NULL, @t, out_, @l) <> ERROR_SUCCESS Then Exit Sub 
 
      If t = REG_SZ Then  
 
         out_[512 - 1] = 0 
 
      end if
 
      if t = REG_DWORD then
 
            rc = RegQueryValueEx(hKey_, name_, NULL, @t, out_, @l)
 
            RegVal=str$(asc(*out_))
 
        end if
 
        RegCloseKey(hKey_) 
 
    End If 
 
End Sub 
 
 
Sub myRegSetStr(root As HKEY, sub_ As ZString ptr, name_ As ZString ptr, in_ As ZString ptr) 
 
  Dim hKey_ As HKEY 
 
    RegCreateKeyEx(root,sub_,0,0,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,@hKey_,0) 
 
    RegSetValueEx(hKey_,name_,0,REG_SZ,in_,Len(*in_)+1) 
 
    RegCloseKey(hKey_) 
 
End Sub 
 
 
 
 
'Wert schreiben
 
'myRegSetStr(HKEY_LOCAL_MACHINE,"SOFTWARE\Yetifoot\Test", "HELLO", "Blah Blah") 
 
 
RegVal = "" 'ACHTUNG: Rückgabewert ist STRING!!!!
 
 
'Wert auslesen
 
myRegGetStr(HKEY_CLASSES_ROOT,"http\shell\open\command", "", @RegVal) 
 
Print RegVal  'Gibt beim DesktopPC opera.exe zurück
 
'if regval="opera.exe" then
 
'    myRegGetStr(HKEY_CLASSES_ROOT,"Applications\opera.exe\shell\open\command",_ 
 
'                    "", @RegVal)     
 
'    print RegVal
 
'end if
 
 
myRegGetStr(HKEY_LOCAL_MACHINE, "Software\Fraps2", "Capture Key", @RegVal) 
 
Print RegVal 'Gibt 121 zurück
 
 
Sleep
 
 | 	  
 
 
Problem 2 (level 0...) existert weiterhin.
 
 
Nun auch gelöst:
 
die im Code enthaltenen defines wie folgt verändern:
 
#define HKEY_CLASSES_ROOT     (CAST(HKEY, &H80000000)) 
 
#define HKEY_CURRENT_CONFIG   (CAST(HKEY, &H80000005)) 
 
#define HKEY_CURRENT_USER     (CAST(HKEY, &H80000001)) 
 
#define HKEY_DYN_DATA         (CAST(HKEY, &H80000006)) 
 
#define HKEY_LOCAL_MACHINE    (CAST(HKEY, &H80000002)) 
 
#define HKEY_PERFORMANCE_DATA (CAST(HKEY, &H80000004)) 
 
#define HKEY_USERS            (CAST(HKEY, &H80000003))
 
 
für die Interessierten ein Beispiel-Prg mit Auslesen von Schlüsseln: String, DWORD, Binary:
 
 	  | Code: | 	 		  
 
'http://www.freebasic.net/forum/viewtopic.php?t=2293
 
'http://www.freebasic.net/forum/viewtopic.php?t=4062
 
screen 18
 
Option Explicit 
 
 
#include "windows.bi" 
 
#inclib "advapi32"
 
 
'#define HKEY_CLASSES_ROOT  &H80000000 
 
'#define HKEY_CURRENT_CONFIG  &H80000005 
 
'#define HKEY_CURRENT_USER  &H80000001 
 
'#define HKEY_DYN_DATA  &H80000006 
 
'#define HKEY_LOCAL_MACHINE  &H80000002 
 
'#define HKEY_PERFORMANCE_DATA  &H80000004 
 
'#define HKEY_USERS  &H80000003 
 
#define HKEY_CLASSES_ROOT     (CAST(HKEY, &H80000000))  'Kein passing scalar...
 
#define HKEY_CURRENT_CONFIG   (CAST(HKEY, &H80000005))  'Fehler mehr
 
#define HKEY_CURRENT_USER     (CAST(HKEY, &H80000001)) 
 
#define HKEY_DYN_DATA         (CAST(HKEY, &H80000006)) 
 
#define HKEY_LOCAL_MACHINE    (CAST(HKEY, &H80000002)) 
 
#define HKEY_PERFORMANCE_DATA (CAST(HKEY, &H80000004)) 
 
#define HKEY_USERS            (CAST(HKEY, &H80000003))
 
 
Dim shared RegVal As ZString * 1024 
 
 
dim shared root as hkey
 
Function myRegGetStr(root As HKEY, sub_ As ZString ptr, name_ As ZString ptr, out_ As ZString ptr) as string
 
  Dim hKey_ As HKEY 
 
  dim as long rc,KeyValType
 
  Dim KeyData As Long
 
  RegVal=""
 
    If RegOpenKeyEx(root, sub_, 0, KEY_READ, @hKey_) = ERROR_SUCCESS Then 
 
        Dim l As DWORD = 512 
 
        Dim t As DWORD 
 
        If RegQueryValueEx(hKey_, name_, NULL, @t, out_, @l) <> ERROR_SUCCESS Then Return "" 
 
      If t = REG_SZ Then  
 
         out_[512 - 1] = 0 
 
      end if
 
      if t = REG_DWORD then
 
            rc = RegQueryValueEx(hKey_, name_, NULL, @t, out_, @l)
 
            if rc <> ERROR_SUCCESS then 
 
                RegVal=""
 
            else
 
                RegVal=str$(asc(*out_))
 
            end if
 
        end if
 
        if t = REG_BINARY then
 
            rc = RegQueryValueEx(hKey_, name_, NULL, @t, out_, @l)
 
            if rc <> ERROR_SUCCESS then 
 
                RegVal=""
 
            else
 
                RegVal=left$(str$(*out_),l)
 
                dim as string RegValTmp,RegValTmp2,RegValTmp3
 
                RegValTmp =""
 
                RegValTmp2=""
 
                RegValTmp3=""
 
                dim x as integer
 
                for x=0 to l-1
 
                    RegValTmp=mid$(RegVal,1+x,1)
 
                    RegValTmp2=hex$(asc(RegValTmp))
 
                    if len(RegValTmp2)=1 then 
 
                        RegValTmp2="0"+RegValTmp2
 
                    end if
 
                    RegValTmp3=RegValTmp3+RegValTmp2+" "
 
                next x
 
                RegVal=rtrim$(RegValTmp3)
 
            end if
 
        end if
 
        Return RegVal
 
        RegCloseKey(hKey_) 
 
    End If 
 
End Function 
 
 
Sub myRegSetStr(root As HKEY, sub_ As ZString ptr, name_ As ZString ptr, in_ As ZString ptr) 
 
  Dim hKey_ As HKEY 
 
    RegCreateKeyEx(root,sub_,0,0,REG_OPTION_NON_VOLATILE,KEY_SET_VALUE,NULL,@hKey_,0) 
 
    RegSetValueEx(hKey_,name_,0,REG_SZ,in_,Len(*in_)+1) 
 
    RegCloseKey(hKey_) 
 
End Sub 
 
 
 
 
'Wert schreiben
 
'myRegSetStr(HKEY_LOCAL_MACHINE,"SOFTWARE\Yetifoot\Test", "HELLO", "Blah Blah") 
 
 
 
'Wert auslesen
 
'Der Rückgabewert ist ein String, egal welcher Typ erfragt wurde
 
print myRegGetStr(HKEY_CLASSES_ROOT,"http\shell\open\command", "", @RegVal) 
 
'Gibt beim DesktopPC opera.exe zurück, auf LapTop "IExplorer... (STRING)
 
print myRegGetStr(HKEY_LOCAL_MACHINE, "Software\Fraps2", "Capture Key", @RegVal) 
 
'Gibt auf Desktop-PC 121 zurück (DWORD)
 
 
Print myRegGetStr(HKEY_LOCAL_MACHINE, _
 
    "SOFTWARE\H+BEDV\Workstation\AntiVir PersonalEdition Premium V 7", "ID", @RegVal) 
 
'Gibt auf Laptop 150 zurück (DWORD)
 
 
print myRegGetStr(HKEY_LOCAL_MACHINE, "SOFTWARE\LapLink\Track", "InstallDate", @RegVal) 
 
'Gibt auf Laptop 5A A6 0C 43 zurück (BINARY)
 
 
Sleep
 
 | 	 
  | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		ytwinky
 
  
  Anmeldungsdatum: 28.05.2005 Beiträge: 2624 Wohnort: Machteburch
  | 
		
			
				 Verfasst am: 06.05.2006, 16:03    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Michael Frey hat Folgendes geschrieben: | 	 		  | ..Lass doch die Registry zu frieden.. | 	  ..nicht ganz zu Unrecht!
 
Wenn ich einen HiveKey öffne, muß ich ihn auch wieder schließen.
 
Das machst du ja auch richtig.
 
ABER VORHER steht schonalso wird der Key nicht geschlossen!
 
Nun, bislang ist mein Windows dadurch nicht abgestürzt.
 
Es ist nicht Nörgelei, sondern Vorsicht, die mir gebietet, darauf hinzuweisen.
 
Gruß
 
ytwinky _________________
  	  | v1ctor hat Folgendes geschrieben: | 	 		  | Yeah, i like INPUT$(n) as much as PRINT USING.. | 	  ..also ungefähr so, wie ich GOTO.. | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		oldirty
 
  
  Anmeldungsdatum: 04.08.2005 Beiträge: 65
 
  | 
		
			
				 Verfasst am: 06.05.2006, 16:50    Titel:  | 
				     | 
			 
			
				
  | 
			 
			
				Danke für die Info,
 
 
habe meinen Code geändert | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
  | 
   
 
     |