CPU Model auslesen!
-
Moin zusammen,
ich habe ein Problem:
AnsiString TVerteilerF::CpuAuslesen() { HKEY hkey; DWORD type; DWORD size; DWORD processorspeed = 0; DWORD dwData = sizeof(DWORD); char processorname[MAX_PATH]; char sendspeed[MAX_PATH]; char computername[MAX_PATH]; // (1) Processor Name RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",0,KEY_ALL_ACCESS,&hkey); RegQueryValueEx(hkey,"ProcessorNameString",0,&type,(LPBYTE)processorname,&size); // (2) Processor Speed RegQueryValueEx(hkey,"~MHz",0,0,(BYTE*)&processorspeed,&dwData); RegCloseKey(hkey); // die Geschwindigkeit in einem String ultoa(processorspeed,sendspeed,MAX_PATH); return AnsiString(processorname); }
Bekomme name des Prozessors nicht ausgelesen!
Hat jemand eine Idee?
-
Was genau bekommst du denn stattdessen ausgelesen? Oder was bekommst du für einen Fehler!?
-
Binäre Zeichen!
-
aha.
Ich schlag vor, dass du einfach mal die Rückgabewerte der Funktionen prüfst, die du da verwendest. Irgendetwas sagt mir, dass die dir verraten werden, wo genau das Problem liegt...
-
ist ja kein Problem:
HKEY hkey; DWORD type; DWORD size; DWORD processorspeed = 0; DWORD dwData = sizeof(DWORD); long ret; char processorname[MAX_PATH]; char sendspeed[MAX_PATH]; char computername[MAX_PATH]; // (1) Processor Name ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",0,KEY_ALL_ACCESS,&hkey); if(ret == ERROR_SUCCESS) { RegQueryValueEx(hkey,"ProcessorNameString",0,&type,(LPBYTE)processorname,&size); // (2) Processor Speed //RegQueryValueEx(hkey,"~MHz",0,0,(BYTE*)&processorspeed,&dwData); RegCloseKey(hkey); // die Geschwindigkeit in einem String //ultoa(processorspeed,sendspeed,MAX_PATH); } return AnsiString(processorname);
Resultat bleibt unverändert!
-
Die anderen Funktionen haben auch Rückgabewerte...
-
OK:
HKEY hkey; DWORD type; DWORD size; DWORD processorspeed = 0; //DWORD dwData = sizeof(DWORD); LONG ret; AnsiString RetStr; char processorname[MAX_PATH]; char sendspeed[MAX_PATH]; char computername[MAX_PATH]; // (1) Processor Name ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",0,KEY_ALL_ACCESS,&hkey); if(ret == ERROR_SUCCESS) { LONG Fehler = RegQueryValueEx(hkey,"ProcessorNameString",0,&type,(LPBYTE)processorname,&size); if(Fehler == ERROR_SUCCESS) RetStr = AnsiString(processorname); else RetStr = "Fehler: "+IntToStr(int(GetLastError())); // (2) Processor Speed //RegQueryValueEx(hkey,"~MHz",0,0,(BYTE*)&processorspeed,&dwData); RegCloseKey(hkey); // die Geschwindigkeit in einem String //ultoa(processorspeed,sendspeed,MAX_PATH); } return RetStr;
Bekomme 0 raus! Weiß nicht warum???
-
aesse schrieb:
OK:
ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",0,KEY_ALL_ACCESS,&hkey);
Bekomme 0 raus! Weiß nicht warum???
Noch so ein Programmierer, der unbedingt will, daß seine Programme nur als Admin laufen, damit ja alle Viren und sonstiger Schrott freie Bahn haben. Versuchst mal damit:
ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",0,KEY_READ,&hkey);
mfg Martin
-
Und besser mit RegQueryValueExA()...
-
mgaeckler schrieb:
aesse schrieb:
OK:
ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",0,KEY_ALL_ACCESS,&hkey);
Bekomme 0 raus! Weiß nicht warum???
Noch so ein Programmierer, der unbedingt will, daß seine Programme nur als Admin laufen, damit ja alle Viren und sonstiger Schrott freie Bahn haben. Versuchst mal damit:
ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",0,KEY_READ,&hkey);
mfg Martin
Du mußt auch die Größe mitgeben:
size = MAX_PATH; LONG Fehler = RegQueryValueEx(hkey,"ProcessorNameString",0,&type,(LPBYTE)processorname,&size);
so funktioniert's:
void __fastcall TForm1::FormShow(TObject *Sender) { HKEY hkey; DWORD type; DWORD size; //DWORD dwData = sizeof(DWORD); LONG ret; AnsiString RetStr; char processorname[MAX_PATH]; // (1) Processor Name ret = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",0,KEY_READ,&hkey ); if(ret == ERROR_SUCCESS) { size = MAX_PATH; LONG Fehler = RegQueryValueEx(hkey,"ProcessorNameString",0,&type,(LPBYTE)processorname,&size); if(Fehler == ERROR_SUCCESS) RetStr = AnsiString(processorname); else RetStr = "Fehler: "+IntToStr(int(GetLastError())); RegCloseKey(hkey); } Caption = RetStr; }
mfg Martin
-
Bei mir gibt die Funktion nichts zurück! Leer!
-
aesse schrieb:
Bei mir gibt die Funktion nichts zurück! Leer!
Merkwürdig, der Rückgabetyp von RegQueryValueEx ist aber long. Wie kann der leer sein?
-
aesse schrieb:
Bei mir gibt die Funktion nichts zurück! Leer!
Hast Du denn auch die Größe angegeben?
-
Funktioniert alles!!!
ich hatte die letzte Zeile im letzten Postcode einfach rauskopiert und nicht geändert, aber jetzt:
HKEY hkey; DWORD type; DWORD size = MAX_PATH; //DWORD dwData = sizeof(DWORD); LONG ret; AnsiString RetStr; char processorname[MAX_PATH]; // (1) Processor Name ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0",0,KEY_READ,&hkey); if(ret == ERROR_SUCCESS) { LONG Fehler = RegQueryValueExA(hkey,"ProcessorNameString",0,&type,(LPBYTE)processorname,&size); if(Fehler == ERROR_SUCCESS) RetStr = AnsiString(processorname); else RetStr = ""; RegCloseKey(hkey); } return RetStr;
Und Vielen Dank, habe ich wieder was dazu gelernt!
-
Wenn du explizit mit char arbeitest, dann immer auch die passende *A Variante der WinAPI Funktionen nehmen.
-
Danke werde ich tun!!!
-
Nur so als Ergänzung: Das gleiche gilt natürlich auch, wenn du explizit mit wchar_t arbeitest, dann immer die *W Varianten nehmen...