Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 11:12

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[C++] Registry auslesen

Discussion on [C++] Registry auslesen within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
[C++] Registry auslesen

Ich suche nach einer Möglichkeit, Zeichenfolgen(REG_SZ) aus der Windows Registry auszulesen.

Geeignet dafür sind die Funktionen RegOpenKeyEx und RegQueryValueEx von der WinAPI... Allerdings weiß ich nicht, wie ich damit Zeichenfolgen auslesen kann. Alle Beispiele, die ich dazu finden konnte waren auf DWORD bezogen.
.Infinite is offline  
Old 06/15/2011, 15:51   #2
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Der fünfte Parameter von RegQueryValueEx() legt den Buffer fest, in den die Daten gespeichert werden. Es handelt sich dabei um ein BYTE-Array, wie du sicher der Dokumentation entnommen hast. BYTE ist eine von Windows definierte Datenstruktur und nichts anderes als ein unsigned char. Damit hast du deine Zeichenkette.
xNopex is offline  
Old 06/15/2011, 18:09   #3
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
Also irgendwie klappt das immer noch nicht. Wenn ich den buffer ausgebe kommt immer so etwas wie 001CFB78. Und der Wert ist jedesmal anders...

Das gleiche Ergebnis habe ich, wenn ich die Registry-Klasse aus der ATL nehme (CRegKey)
.Infinite is offline  
Old 06/15/2011, 18:48   #4
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Du gibst den Buffer auf der Konsole oder wo auch immer vermutlich falsch aus. Das sieht aus, als ob du anstatt den Inhalt eines Pointers, die Adresse des Pointers ausgibst.

Code:
char buffer[128];
ZeroMemory(buffer, 128);
.
.
.
std::cout.write(buffer, strlen(buffer));
EDIT:
Ich habe mich mal erbarmt und dir ein komplettes Beispiel erstellt:
Code:
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    HKEY hKeyValue = NULL;
    long ret = RegOpenKeyEx(HKEY_USERS, ".DEFAULT\\Environment", 0, KEY_READ, &hKeyValue);
    if(ret != ERROR_SUCCESS)
    {
        cout << "RegOpenKeyEx failed. Error code: " << GetLastError();
        return 1;
    }

    DWORD bufferLen = 128;
    BYTE buffer[bufferLen];
    ret = RegQueryValueEx(hKeyValue, "TEMP", NULL, NULL, buffer, &bufferLen);
    if(ret != ERROR_SUCCESS)
    {
        cout << "RegQueryValueEx failed. Error code: " << GetLastError();
        return 1;
    }
    buffer[bufferLen] = 0;
    cout.write((const char*)(buffer), bufferLen);
    return 0;
}
xNopex is offline  
Thanks
1 User
Old 06/16/2011, 14:42   #5
 
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
Danke! Es funktioniert jetzt auf jeden Fall...

Ich habe aber trotzdem noch ein paar Fragen und Anmerkungen zum Verständnis. Vielleicht hilft es ja auch anderen.

PHP Code:
#include <iostream>
#include <windows.h>

using namespace std;

int main()
{
    
HKEY hKeyValue NULL// mit null initialisieren ist unnötig oder? //
    
long ret RegOpenKeyEx(HKEY_USERS".DEFAULT\\Environment"0KEY_READ, &hKeyValue);
    if(
ret != ERROR_SUCCESS)
    {
        
cout << "RegOpenKeyEx failed. Error code: " << GetLastError();
        return 
1;
    }

    
DWORD bufferLen 128// warum 128? //
    
BYTE buffer[bufferLen];  // ließ sich bei mir nicht kompilieren. Da muss eine Konstante rein //
    
ret RegQueryValueEx(hKeyValue"TEMP"NULLNULLbuffer, &bufferLen);
    if(
ret != ERROR_SUCCESS)
    {
        
cout << "RegQueryValueEx failed. Error code: " << GetLastError();
        return 
1;
    }
    
buffer[bufferLen] = 0// warum den string mit null terminieren? funktionieren tut es auch ohne //
    
cout.write((const char*)(buffer), bufferLen);
    return 
0;

Außerdem musste ich bei mir immer vor dem Pfad des Schlüssels und dem Namen das Makro _T benutzen, sonst gab es einen Fehler mit den Typen.
Und bei der Ausgabe sind zwischen den Buchstaben immer Leerzeichen. Auch komisch...
.Infinite is offline  
Old 06/16/2011, 15:03   #6
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Quote:
HKEY hKeyValue = NULL; // mit null initialisieren ist unnötig oder? //
Lieber einmal zu viel mit NULL einen Pointer ungültig machen, als dass man zur Runtime einen Error bekommt. Das ist guter Stil.

Quote:
DWORD bufferLen = 128; // warum 128? //
Die Zahl ist beliebig. Ich habe den Buffer halt mal 128Zeichen groß gemacht. Dachte das wird genügen. Man kann ihn aber auch größer/kleiner machen.

Quote:
BYTE buffer[bufferLen]; // ließ sich bei mir nicht kompilieren. Da muss eine Konstante rein //
Kommt davon, wenn man den Microsoft-Compiler verwendet MinGW meckert nicht. Beim Microsoft Compiler müsstest du es so machen:
Code:
DWORD bufferLen = 128;
BYTE buffer[128];
Du darfst hierbei 'bufferLen' nicht als Konstante setzen, da du sie später als in/out Pointer an RegQueryValueEx() übergibst.

Quote:
buffer[bufferLen] = 0; // warum den string mit null terminieren? funktionieren tut es auch ohne //
Terminieren tut man ein C-String eigentlich immer. Dass es bei dir auch ohne funktioniert, liegt wohl einfach daran, dass der Compiler dafür gesorgt hat, dass der Speicher zuvor mit '0' aufgefüllt wurde. vgl. ZeroMemory().

Quote:
Außerdem musste ich bei mir immer vor dem Pfad des Schlüssels und dem Namen das Makro _T benutzen, sonst gab es einen Fehler mit den Typen.
Und bei der Ausgabe sind zwischen den Buchstaben immer Leerzeichen. Auch komisch...
Das liegt daran, dass du Unicode verwendest und ich Ansi. Entweder du stellst das in den Projekteinstellungen um, oder du verwendest anstatt "char" "wchar_t" und "wcout" anstatt "cout".
xNopex is offline  
Thanks
1 User
Old 06/16/2011, 16:30   #7
 
elite*gold: 150
Join Date: Dec 2010
Posts: 112
Received Thanks: 159
für REG_SZ könnte man auch RegGetValue benutzen.

Quote:
To ensure that any string values (REG_SZ, REG_MULTI_SZ, and REG_EXPAND_SZ) returned are null-terminated, use the RegGetValue function.

5769854332 is offline  
Old 06/19/2011, 00:58   #8
 
elite*gold: 0
Join Date: Jul 2010
Posts: 388
Received Thanks: 196
Quote:
Originally Posted by .Infinite View Post
HKEY hKeyValue = NULL; // mit null initialisieren ist unnötig oder? //
Initialisierst du deine Variablen nicht, machst du nichts anderes als den Stackpointer zu versetzen. Die Daten die dann dort liegen sind im Grunde willkürlich (was auch immer da vorher auf dem Stack lag). Wenn du durch irgendeine Unachtsamkeit dann den Wert liest und ggf. weiter damit arbeitest erhältst du willkürliche Ergebnisse. Das kann Fehler erzeugen von einfacher Verschmierung deiner Daten bis zu Speicherverletzungen. Wenn du deine Variablen mit sinnvollen Werten bzw. 0 initialisierst hast du diese Probleme nicht, bzw. hast es einfacher die Ursache aufzuspüren.
SmackJew is offline  
Thanks
2 Users
Reply


Similar Threads Similar Threads
Dateipfad aus Registry auslesen
02/15/2011 - General Coding - 2 Replies
Hi epvp*coders, ich meine mich wage daran erinnern zu können, dass es in Delphi eine Funktion gab, mit der man den Dateipfad einer Datei aus der Registry auslesen konnte. Jemand ne Idee, welche Fkt. das war? Kann auch gut sein, dass ich da was verwechsle, ich vertausch gerne mal Programmiersprachen :x Oh yeah, almost forgot to involve the English speakin' part in here. So I am searching for a function in Delphi to get a file path out of the registry. I might mix up some computer languages...
Registry Tweaks
01/02/2007 - Technical Support - 0 Replies
i hope this it help some ppl for freend some ram and speeding their pc :) ;Windows Registry Editor Version 5.00 ; ** Best Viewed In Tahoma Font ** ; ; ; --== Version 1.8 ==-- ; Created By: John Cronk aka "Johnny Do"



All times are GMT +1. The time now is 11:13.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.