RegQueryValueEx(...) ohne Feld und mit Zeichenausgabe



  • Ich habe folgendes geschrieben und zwar zum Auslesen eines DWORD Wertes (DWORD Wert steht in dwData):

    LPCTSTR lpValueName;
    DWORD dwData;
    
    DWORD cbData = sizeof(dwData);
    
    RegQueryValueEx(
    	m_hKey,
    	lpValueName,
    	0,
    	0,
    	(LPBYTE) &dwData,
    	&cbData
    	); // DWORD lesen
    

    Nun hab ich mir das so ähnlich mit Zeichen ausgeben gedacht, aber dies funktioniert nicht:

    LPCTSTR lpValueName;
    LPCTSTR lpData;
    
    DWORD cbData = sizeof(lpData);
    
    RegQueryValueEx(
    	m_hKey,
    	lpValueName,
    	0,
    	0,
    	(LPBYTE) &lpData,
    	&cbData
    	); // String lesen
    

    Und nun müssten in lpData die Zeichen stehen, eigentlich!

    Hier noch ein Beispiel, was auch nicht funktioniert:

    LPCTSTR lpValueName;
    LPCTSTR lpData;
    BYTE lpDataI;
    DWORD cbData = sizeof(lpDataI);
    
    RegQueryValueEx(
    	m_hKey,
    	lpValueName,
    	0,
    	0,
    	&lpDataI,
    	&cbData
    	);
    
    lpData = (LPCTSTR) lpDataI;
    

    Wer kann mir dabei helfen??? Ich möchte kein(!) char cData[0xFF] benutzen!!!

    Cu CaseModder 🙂



  • Ich möchte die Frage nochmal neu aufrollen.

    Also, ich möchte einen Wert der vom Typ String ist auslesen. Dies Funktioniert mittels drei Funktionen.

    RegOpenKeyEx(...);
    RegQueryValueEx(...);
    RegCloseKey(...);
    

    Das Problem liegt bei der Funktion RegQueryValueEx. Und zwar liegt das Problem ganz genau auf den letzten zwei Parametern. Im vorletzten wird ein LPBYTE ausgegeben und in der letzten die Größe des zu ausgegebenen. Nun wäre es einfach mittels folgendem den Wert auszulesen:

    char cData[0xFF]
    DWORD dwSize = sizeof(cData);
    
    RegQueryValueEx(
    m_hKey, // Handle zu einem geöffneten Schlüssel
    lpValueName, // Name des auszulesenen Wertes
    0, // muss null bleiben
    0, // brauch ich nicht, brauche keine Datentypangabe
    (LPBYTE) cData, // Daten werden in cData gespeichert
    &dwSize
    );
    

    Ich möchte aber das cData durch ein BYTE, LPBYTE, LPCTSTR ersetzt haben. Weil ich halt nicht genau weiß wie groß das ausgelesene wird, um bufferoverflow zu vermeiden, ... Will also den Wert in nem Pointer von char oder string ausgeben. Da stellt sich noch die Frage, wie man dann die Größe herausbekommt???

    Hoffe Ihr könnt helfen

    Cu CaseModder 🙂



  • Du kannst nicht einfach ein LPCTSTR o.ä. verwenden, ohne dafür Speicher zu reservieren. Wenn dein Buffer aber zu klein ist bekommst du keinen Bufferoverflow (dazu gibst du ja in lpcbData die Größe des Buffers an).
    Die Doku verät aber, wie du vorgehen musst (ist sogar ein Beispiel mit dabei):

    If the buffer specified by lpData parameter is not large enough to hold the data, the function returns ERROR_MORE_DATA and stores the required buffer size in the variable pointed to by lpcbData. In this case, the contents of the lpData buffer are undefined.



  • Hi flenders!

    Danke dir erstmal. In der Doku im I-Net steht ja en neuer Eintrag drin. Also ich meine das Bsp. stand glaub ich nicht bei mir in der 2003 vom April oder so drin.

    Danke dir, werds mal angucken und checken!

    Cu CaseModder 🙂



  • Hi!

    Ich hab nun das Beispiel in der Doku ausprobiert und scheitere immer noch

    Erstmal der Quelltext:

    DWORD BufferSize = TOTALBYTES;
    PPERF_DATA_BLOCK PerfData = NULL;
    
    HKEY hKey;
    
    RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\abcd", 0, KEY_ALL_ACCESS, &hKey);
    
    while(RegQueryValueEx(hKey,
    "dds",
    NULL,
    NULL,
    (LPBYTE) PerfData,
    &BufferSize) == ERROR_MORE_DATA)
    {
        BufferSize += BYTEINCREMENT;
        PerfData = (PPERF_DATA_BLOCK) realloc(PerfData, BufferSize);
    }
    
    const int aaa = (const int) BufferSize;
    char cData[aaa];
    
    RegQueryValueEx( hKey,
    TEXT("dds"),
    NULL,
    NULL,
    (LPBYTE) cData,
    &BufferSize);
    

    Also ich kann die Anzahl der Zeichen auslesen. Nun wollte ich dies in ein char folgend tun:

    char[iSize]
    

    Natürlich geht das nicht, aber ich muss dies irgendwie hinbekommen und wie?
    Kann mir einer helfen? Also ich will ein char, das ich im Programm einen bestimmten Speicher zuordne. Oder kann man die Daten irgendwie aus "PerfData" auslesen??? Vielleicht auch irgendwie in ein Pointer???

    Danke für hilfe

    Cu CaseModder 🙂


Anmelden zum Antworten