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... 😉


Anmelden zum Antworten