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:
ein Fehler
Genauer!
-
@ciatronicalx sagte in Unerklärlicher Fehler beim Holen mehrerer Werte aus der Registry:
RegQueryValueExA
- falsches Forurm
- 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!