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!
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Welchen Compiler benutzt Du, und auf welcher Plattform?
So, gerade mal etwas näher den Source angeschaut, dazu fallen mir eine Menge Anmerkungen ein :)
Falls Du VC++ 7.0 oder höher im Einsatz hast, benutz doch die Klasse CRegKey aus der MFC, damit ist der Umgang viel bequemer. Nix gegen Win32 API, aber warum muss mans sich unbedingt schwerer machen als nötig? :)
Zum Zweiten fehlt da ein & in der Zeile:
if( ERROR_SUCCESS != RegQueryValueEx (hKey, "~MHz",
NULL, &dwType,
(LPBYTE)dwValue, &dwSize))
Das muesste naemlich eigentlich (LPBYTE)&dwValue heissen :)
Zum zweiten wäre es im Sinne einer defensiven Programmierung, hier einen Buffer vorzusehen, erst in den Buffer auszulesen und dann die ersten vier Bytes des Buffers einfach per casting in ein DWORD zu übertragen.
Aber zuerstmal sollte es vom Prinzip her funktionieren, dann sehen wir weiter :)
Was ich auch ueberhaupt nicht verstehe, ist dann das Gefrickel mit dem float am Ende. Warum benutzt Du nicht einfach sprintf? Damit kannst Du Dir einen ganzen Haufen Aufwand sparen :)
Hey du glaubst nicht wie dankbar ich dir bin... :)
Ich hab den ganzen verschi**enen Tag an dem Teil herumgebastelt und wirklich alle erdenklichen Möglichkeiten ausprobiert.
Und alles liegt an so einem kleinen doofen Zeichen (&).
Ich verwende übrigens Visual Studio 6 (naja nicht gerade aktuell).
Wenn du noch gerade etwas Zeit hättes, würde es mich freuen, wenn du noch etwas genauer erklären könntes, wie du das mit dem Buffer gemeint hast.
Das Gebastel mit der flaot variable ist wirklich nicht nötig, man kann auch direkt dword verwenen.
strStream strStream >> strString;
Das war mehr so ein Verzweiflungsversuch.
Ist es denn noch anders irgendwie möglich diesen DWORD in einen std string zu konvertieren? Hab das so in einem Forum gefunden...
Jedenfalls noch mal vielen Dank!!!
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 :)
Vielen Dank!
Werde mir das noch mal genauer anschauen.