Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Registrywerte per APIs auslesen, wie?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
oldirty



Anmeldungsdatum: 04.08.2005
Beiträge: 65

BeitragVerfasst am: 04.05.2006, 22:55    Titel: Registrywerte per APIs auslesen, wie? Antworten mit Zitat

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(3cool : 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 05.05.2006, 17:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
oldirty



Anmeldungsdatum: 04.08.2005
Beiträge: 65

BeitragVerfasst am: 05.05.2006, 18:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ytwinky



Anmeldungsdatum: 28.05.2005
Beiträge: 2624
Wohnort: Machteburch

BeitragVerfasst am: 06.05.2006, 17:03    Titel: Antworten mit Zitat

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 schon
Code:
Return RegVal
also 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
oldirty



Anmeldungsdatum: 04.08.2005
Beiträge: 65

BeitragVerfasst am: 06.05.2006, 17:50    Titel: Antworten mit Zitat

Danke für die Info,

habe meinen Code geändert
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz