Registry REG_SZ auslesen



  • Hey All,
    ich benötige für ein kleines Programm ohne GUI einen Wert aus der Registry.
    Als Compiler setze ich minGW (g++) ein.

    Ich habe mir schon einige Codebeispiele bei Stackoverflow angeschaut.
    Leider funktioniert keines bei mir.

    Kann ich minGW als Compiler einsetzen?

    Welche Dateien muss ich inkludieren.

    Muss ich eventuell einige DLLs mit verlinken?

    Gibt es Codesnipsel für mein Problem?

    Vielen Dank Ronny



  • Ok ich habe doch noch was gefunden

    #include <iostream>
    #include <string>
    #include <conio.h>
    #include <windows.h>
    using namespace std;
    
    int main()
    {
    	HKEY hKey;
    	string strKeyPath = "Software\\CPUID\\HWMonitor\\VistaSidebar";
    	string strKeyName = "T[CORE#0-0]";
    	DWORD dwValueType;
    	byte byteValue[50];
    	DWORD dwValueSize;
    	
    	if( RegOpenKeyExA(HKEY_CURRENT_USER, strKeyPath.c_str(), 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS )
    	{
    		cout << "ERROR - Unable to open the key!";
    		_getch();
    		return -1;
    	}
    
    	if( RegQueryValueExA(hKey, strKeyName.c_str(), NULL, &dwValueType, byteValue, &dwValueSize) != ERROR_SUCCESS )
    	{
    		cout << "ERROR - Unable to get the key's value!";
    		_getch();
    		return -1;
    	}
    
    	unsigned int uiValue = atoi((char*)byteValue);
    
    	cout << "Value: " << uiValue << "String: " << byteValue  << endl;
    
    	RegCloseKey(hKey);
    
    	cout << endl << "Press any key to exit . . . ";
    	_getch();
    	return 0;
    } 
    

    Vielleicht hilft es ja mal jemand..



  • @ciatronicalx sagte in Registry REG_SZ auslesen:

    if( RegQueryValueExA(hKey, strKeyName.c_str(), NULL, &dwValueType, byteValue, &dwValueSize) != ERROR_SUCCESS )
    

    Potenzieller Buffer Overflow, da dwValueSize nicht mit einem sinnvollem Wert initialisiert wurde.

    Wie es richtig geht steht in der MSDN:

    If lpData [hier byteValue] is NULL, and lpcbData [hier dwValueSize] is non-NULL, the function returns ERROR_SUCCESS and stores the size of the data, in bytes, in the variable pointed to by lpcbData. This enables an application to determine the best way to allocate a buffer for the value's data.

    Also zuerst

    RegQueryValueExA(hKey, strKeyName.c_str(), nullptr, &dwValueType, nullptr, &dwValueSize);
    

    aufrufen und, und dann bei einem zweiten Aufruf als fünften Parameter (lpData) einen std::vector mit passender Größe übergeben.

    Weiters wird im Fehlerfall der hKey nicht geschlossen. Besserer Ansatz: Use Modern C++ to Access the Windows Registry.

    @Mods: Bitte nach WinAPI erschieben.


Log in to reply