Unerklärlicher Fehler beim Holen mehrerer Werte aus der Registry



  • Hey All,

    ich sitze schon einige Zeit an einem mir unerklärlichen Fehler.
    Ich möchte mehrere Werte eines Schlüssels holen und ausgeben.
    Bei einem Wert klappt alles Fehlerfrei.

    Hole ich mehrere Werte so wird mindesten ein Fehler generiert.
    Erzeuge ich zusätzlich eine Variable "test0" so verschiebt sich der Fehler.

    #include <iostream>
    #include <windows.h>
    using namespace std;
    
    //g++ -o regTest.exe regTest.cpp && regTest.exe
    int main(){
    	HKEY hKey = 0;
    	size_t size = 256;
    	
    	TCHAR test0[size]; // Wenn diese Variable erzeugt wird kann der ERSTE Wert nicht gelesen werden
    						// wenn die Variable nicht existiert wird der ZWEITE Wert nicht gelesen. Warum??
    	LPCTSTR strKeyRegPath = TEXT( "SOFTWARE\\Test\\" );
    	LPCTSTR strKeyControl = TEXT( "Control" );
    	LPCTSTR strKeyPath = TEXT( "Path" );
    	LPCTSTR strKeyApp = TEXT( "AppName" );
    	
    	byte byteValueControl[size];
    	byte byteValuePath[size];
    	byte byteValueAppName[size];
    	
    	DWORD dwValueSizeControl;
    	DWORD dwValueTypeControl;
    	DWORD dwValueSizePath;
    	DWORD dwValueTypePath;
    	DWORD dwValueTypeAppName;
    	DWORD dwValueSizeAppName;
    	
    
    	// read registry
    	if( RegOpenKeyExA( HKEY_LOCAL_MACHINE,  strKeyRegPath  , 0, KEY_ALL_ACCESS, &hKey ) != ERROR_SUCCESS ){
    		cout << "ERROR - Unable to open the key! " << ERROR_SUCCESS << endl;	
    	}
    	else{
    		cout << "Success! Key is open." << endl;
    	}
    	//ERSTER Wert
    	if( RegQueryValueExA( hKey, strKeyControl , NULL, &dwValueTypeControl, byteValueControl, &dwValueSizeControl ) != ERROR_SUCCESS ){
    		cout << "ERROR - Unable to get the key's byteValueControl! " << ERROR_SUCCESS << endl;
    	}
    	else{
    		cout << "Success! byteValueControl is: " << byteValueControl << endl;
    	}
    	//ZWEITER Wert 
    	if( RegQueryValueExA( hKey,  strKeyPath , NULL, &dwValueTypePath, byteValuePath, &dwValueSizePath ) != ERROR_SUCCESS ){
    		cout << "ERROR - Unable to get the key's byteValuePath! " <<  ERROR_SUCCESS <<endl;
    	}
    	else{
    		cout << "Success! byteValuePath is: " << byteValuePath << endl;
    	}
    	//DRITTER Wert
    	if( RegQueryValueExA( hKey, strKeyApp, NULL, &dwValueTypeAppName, byteValueAppName, &dwValueSizeAppName ) != ERROR_SUCCESS ){
    		cout << "ERROR - Unable to get the key's value byteValueAppName!";
    	}
    	else{
    		cout << "Success! byteValuePath is: " << byteValueAppName << endl;
    	}
    	
    	RegCloseKey( hKey );
    	
    }
    

    Woran kann das liegen?? Was mache ich falsch??
    Als Compiler benutze ich minGW (g++).

    Viele Grüße Ronny





  • @ciatronicalx sagte in Unerklärlicher Fehler beim Holen mehrerer Werte aus der Registry:

    RegQueryValueExA

    1. falsches Forurm
    2. ist der Fehler logisch.

    RegQuery... möchte gerne in den SizeParametern auch einen Wert für die initiale Puffer Größe.
    Deine Werte sind nicht initialsiert. Wundert mich also nicht.

    Wieder mal ein typischer Fall von RTFM (Read the fine MSDN) 😉



  • OK, ich habe hier mal gelesen und entsprechend initialsiert. Es funktioniert..
    Hier der Code:

    #include <iostream>
    #include <windows.h>
    #define TOTALBYTES    8192
    #define BYTEINCREMENT 4096
    #define SIZE           256
    using namespace std;
    
    //g++ -o regTest.exe regTest.cpp && regTest.exe
    int main(){
    	size_t size = SIZE;
    	HKEY hKey = 0;
    	DWORD BufferSize = TOTALBYTES;
    	
    	PPERF_DATA_BLOCK dwValueTypeControl =  (PPERF_DATA_BLOCK) malloc( BufferSize );
    	DWORD dwValueSizeControl = BufferSize;
    	
    	PPERF_DATA_BLOCK dwValueTypePath = (PPERF_DATA_BLOCK) malloc( BufferSize );
    	DWORD dwValueSizePath = BufferSize;
    	
    	PPERF_DATA_BLOCK dwValueTypeAppName = (PPERF_DATA_BLOCK) malloc( BufferSize );;
    	DWORD  dwValueSizeAppName = BufferSize;
    	
    	LPCTSTR strKeyRegPath = TEXT( "SOFTWARE\\Test\\" );
    	LPCTSTR strKeyControl = TEXT( "Control" );
    	LPCTSTR strKeyPath = TEXT( "Path" );
    	LPCTSTR strKeyApp = TEXT( "AppName" );
    	
    	byte byteValueControl[size];
    	byte byteValuePath[size];
    	byte byteValueAppName[size];
    	
    	// read registry
    	if( RegOpenKeyExA( HKEY_LOCAL_MACHINE,  strKeyRegPath  , 0, KEY_ALL_ACCESS, &hKey ) != ERROR_SUCCESS ){
    		cout << "ERROR - Unable to open the key! " << ERROR_SUCCESS << endl;	
    	}
    	else{
    		cout << "Success! Key is open." << endl;
    	}
    
    	if( RegQueryValueExA( hKey, strKeyControl , NULL, NULL,  (LPBYTE) byteValueControl, &dwValueSizeControl ) != ERROR_SUCCESS ){
    		cout << "ERROR - Unable to get the key's byteValueControl! " << ERROR_SUCCESS << endl;
    	}
    	else{
    		cout << "Success! byteValueControl is: " << byteValueControl << endl;
    	}
    	
    	if( RegQueryValueExA( hKey,  strKeyPath , NULL, NULL,  (LPBYTE) byteValuePath, &dwValueSizePath ) != ERROR_SUCCESS ){
    		cout << "ERROR - Unable to get the key's byteValuePath! " <<  ERROR_SUCCESS <<endl;
    	}
    	
    	else{
    		cout << "Success! byteValuePath is: " << byteValuePath << endl;
    	}
    	
    	if( RegQueryValueExA( hKey, strKeyApp, NULL, NULL,  (LPBYTE) byteValueAppName, &dwValueSizeAppName ) != ERROR_SUCCESS ){
    		cout << "ERROR - Unable to get the key's value byteValueAppName!";
    	}
    	else{
    		cout << "Success! byteValuePath is: " << byteValueAppName << endl;
    	}
    	
    	RegCloseKey( hKey );
    }


  • Nur mal noch so am Rande:
    Wenn Du schon RegQueryValueExA, dann solltest Du auf LPCTSTR verwichten und such wirklich LPCSTR und auch der TEXT Makro macht hier absolut keinen Sinn!