Fehler 234 Beim Lesen eines Wertes aus der Registry



  • Hi@all,

    ich bekomme den Fehler 234(Es sind mehr Daten verfügbar) zurück, wenn ich über RegQueryValueEx einen Wert aus HKLM auslesen möchte. Dieser Wert existiert in der Registry und vor allem unter dem Unterschlüssel definitiv nur einmal.

    Warum kommt dieser Fehler?
    Jemand eine Ahnung?

    Gruß

    CrazyPlaya



  • MSDN RegQueryValueEx schrieb:

    If the buffer specified by lpData parameter is not large enough to hold the data, the function returns the value ERROR_MORE_DATA, and stores the required buffer size, in bytes, into the variable pointed to by lpcbData.

    Du hast offenbar zu wenig Speicher mitgegeben, um den gesuchten Schlüssel komplett zu übergeben (oder vergessen, die lpcbData vor dem Aufruf zu initialisieren).



  • Mitgegebener Speicher 261 Byte, Zu holender Wert hat max. 100 Byte.
    Das kann es nicht sein.
    lpcbData ist vorinitialisiert.
    An meinem Rechner wie an vielen anderen funktioniert es auch wunderbar. Doch hier und da gibt es einige Maschinen wo dieser fehler auftritt.
    Ist also nicht auf jedem Rechner so.



  • zeig doch mal etwas mehr Code, damit man den Fehler in Natura beobachten kann. (meine Kristallkugel hat leider Totalschaden, daher kann ich nicht von hier aus erkennen, was du (falsch) gemacht hast)



  • szLConf = '\0';
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\NORA\\Install Info", 0, KEY_READ, &hKey) == ERROR_SUCCESS)
    	{
    		lRet = RegQueryValueEx(hKey, "PhonixPfad",NULL,&dwRetType,(LPBYTE)szLConf,&dwlength);
    		if(lRet != ERROR_SUCCESS)
    		{
    		     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY, NULL, lRet, 0, szErr, sizeof(szErr), NULL);
    		     lstrcat(szErr, " HKLM localconfig");
    		     AfxMessageBox(szErr);
    
    		}
      }
    

    Aber lpcbData muss ja nicht initialisiert sein. Ihr wird doch die tatsächliche Größe übergeben.



  • Was genau ist szLConf? Und wie und wo initialisierst du dwlength?

    Aber lpcbData muss ja nicht initialisiert sein. Ihr wird doch die tatsächliche Größe übergeben.

    Wie kommst du auf den Quatsch? Irgendwie muss die Funktion doch wissen, wie groß der Puffer ist.



  • char szLConf[261];

    Ok du hast recht man sollte Sätze zu Ende lesen:)

    MSDN: The lpcbData parameter can be NULL only if lpData is NULL.

    Ich habe nur bis zum ersten NULL gelesen. Schande über mich.
    Leider gibt es hier keinen Smiley wo man sich in Kopf schießen kann.

    Ich gebe dwLength mal die sizeof(szLConf) mit sollte eher funktionieren.

    Aber dann erklär mir mal warum ich diesen Fehler nicht bekomme.



  • CrazyPlaya schrieb:

    Aber dann erklär mir mal warum ich diesen Fehler nicht bekomme.

    Welchen Fehler? Du übergibst ja nicht NULL, sondern die Adresse einer Variablen, die (vermutlich) den Wert 0 hat.



  • Na den Fehler 234 halt.
    Bei mir am Rechner so wie bei einigen unserer Kunden kommt diese Fehlermeldung nicht und alles läuft wunderbar.
    Das ich nicht NULL übergebe ist mir schon klar. Bin halt davon ausgegangen, das die lcpbData nur Werte zurückbekommt und deshalb habe ich sie nicht initialisiert.



  • CrazyPlaya schrieb:

    Das ich nicht NULL übergebe ist mir schon klar. Bin halt davon ausgegangen, das die lcpbData nur Werte zurückbekommt und deshalb habe ich sie nicht initialisiert.

    Das heißt, du initialisierst dwlength gar nicht? Dann hängt es davon ab, was vorher dort im Speicher stand, und damit auch, ob das klappt.



  • Ja stimmt daran kann es liegen.

    Habe dwlength jetzt mal mit 512 initialisiert. Das sollte dann wohl reichen.

    Besten Dank.



  • CrazyPlaya schrieb:

    Habe dwlength jetzt mal mit 512 initialisiert. Das sollte dann wohl reichen.

    Das ist schon wieder zu viel des Guten 😉 Der Eingabewert gibt an, wieviel Platz die Funktion in lpData zur Verfügung hat - und wenn du da mehr angibst als tatsächlich vorhanden ist, kann das zu einer Access Violation führen (sehr schmerzhaft). sizeof(szlConf) reicht vermutlich völlig.



  • Wenn ich lpData als NULL übergebe, kann ich laut MSDN lpcbData auch als NULL übergeben. Ist das eine gute Lösung?



  • CrazyPlaya schrieb:

    Wenn ich lpData als NULL übergebe, kann ich laut MSDN lpcbData auch als NULL übergeben. Ist das eine gute Lösung?

    Kommt drauf an. Ist dir klar, dass der Wert dann nicht mehr ausgelesen wird?



  • Ich mach es einfach mit der sizeof(szLConf) und dann passt es am besten.


Anmelden zum Antworten