Programmieren - alles kontrollieren 4.934 Themen, 20.613 Beiträge

MHZ aus der Registry auslesen

Yves3 / 5 Antworten / Flachansicht Nickles

Hallo

Warum gibt dieser Code immer 0 zurück und nicht die korrekte MHz Zahl?
Ich bin langsam am verzweifel, hab schon etwa 100 verschieden Varianten probiert und es hat einfach nichts geklappt.
Manchmal waren es auch einfach irgendwelche kryptischen Zeichen :-(

Hab etwa 4 verschieden Foren gefunden, wo diese Problem mal diskutiert wurde und es konnte immer gelöst werden.. nur bei mir geht das nicht :-(

Ihr seid meine letzte Hoffnung!

std::string CHardwareInfo::GetCpuSpeed(void)
{
HKEY hKey;

std::string strString;
std::stringstream strStream;

DWORD dwValue = 0;
DWORD dwSize = sizeof(dwValue);
DWORD dwType;

if( ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"Hardware\\\\Description\\\\System\\\\CentralProcessor\\\\0",
0,
KEY_QUERY_VALUE,
&hKey ))
{
return "Unknown";
}

if( ERROR_SUCCESS != RegQueryValueEx (hKey, "~MHz",
NULL, &dwType,
(LPBYTE)dwValue, &dwSize))
{
MessageBox(NULL,"RegQueryValueEx MHz: Failed","ERROR", MB_OK);
return "Unknown";
}
float fValue = (float)dwValue;
strStream strStream >> strString;

return strString;
}

Schon mal vielen Dank an alle, die sich das etwas genauer anschauen!

bei Antwort benachrichtigen
laola1 Yves3 „Hey du glaubst nicht wie dankbar ich dir bin... : Ich hab den ganzen verschi...“
Optionen

Das mit dem Buffer kannst Du ziemlich vergessen, beim intensiveren Durchlesen der Dokumentation zu RegQueryValueEx hab ich dann gesehen dass die Buffergroesse ja eh mit uebergeben wird (genau deswegen wunderte ich mich ja). Egal :)
Natuerlich kann man das Konvertieren so machen, aber irgendwie sieht das seltsam aus. Wenn ich Zahlen in einen String konvertieren muss, gibts dazu zahlreiche Moeglichkeiten, angefangen von itoa ueber sprintf bis hin zu Sachen wie CString::Format() (wenn man denn die MFC benutzt...) und es ist fast schon Geschmackssache, was man da nimmt. Mit itoa saehe das ganze z.B. so aus:

char* pBuffer; //char pointer auf einen Buffer anlegen
pBuffer = new char[33]; //default Platz reservieren
std::string strString(itoa(dwValue, pBuffer, 10); //hier jetzt erst strString erzeugen, siehe Kommentar unten
delete [] pBuffer; //oben belegten Pufferspeicher wieder freigeben
pBuffer=0; //zur Sicherheit den Pointer ungueltig machen

Der Konstruktor von std::string kann gleich einen char pointer uebergeben bekommen (zumindest nach meiner Doku, YMMV), den liefert itoa praktischerweise gleich als Returnwert.
itoa wandelt eine Integervariable (dword und unsigned int usw. gehen auch) in einen String mit variablem Radix um. 10 gibt eine Dezimalzahl, 16 eine Hexadezimalzahl, usw.

Sieht etwas komplizierter aus als Deine Loesung, laesst sich aber universeller anwenden :)

bei Antwort benachrichtigen