CPU Hersteller und CPU Namen auslesen



  • Hallo,
    wie kann ich den Namen des CPU-Herstellers und den Namen der CPU auslesen/ermitteln?



  • WMI mit Win32_Processor

    Da bekommst Du dann z.B. diese Infos:

    AddressWidth: 32
    Architecture: 0
    Availability: 3
    Caption: x86 Family 15 Model 3 Stepping 4
    CpuStatus: 1
    CreationClassName: Win32_Processor
    CurrentClockSpeed: 3192
    CurrentVoltage: 15
    DataWidth: 32
    Description: x86 Family 15 Model 3 Stepping 4
    DeviceID: CPU0
    ExtClock: 800
    Family: 2
    L2CacheSize: 0
    Level: 15
    LoadPercentage: 0
    Manufacturer: GenuineIntel
    MaxClockSpeed: 3192
    Name: Intel(R) Pentium(R) 4 CPU 3.20GHz
    PowerManagementSupported: False
    ProcessorId: BFEBFBFF00000F34
    ProcessorType: 3
    Revision: 772
    Role: CPU
    SocketDesignation: Microprocessor
    Status: OK
    StatusInfo: 3
    Stepping: 4
    SystemCreationClassName: Win32_ComputerSystem
    SystemName: PIV3200
    UpgradeMethod: 4
    Version: Modell 3, Stepping 4



  • ...und wenn du wissen willst, wie sowas funktioniert: http://www-ti.informatik.uni-tuebingen.de/~heim/software/cpuid/cpuid-1.2.c



  • heftig, da bin ich ja richtig froh, dass es das schon fertig gibt.

    danke



  • das wmi ding ist ziemlich umständlich, ich glaub ich werd einfach das von der uni nehmen



  • sehe gerade das von der uni ist unter der gpl, das ist schlecht



  • Bei dem WMI steig ich nicht durch, auf der Seite zu Win32_Processor in der MSDN gibts unten nen Link zu WMI-Beispielen, aber anscheinend ist das so ne Art Datenbank zumindest steht in dem Beispiel an einer Stelle nen SQL-Statement.
    Wie komm ich denn an so nen Win32_Processor Objekt?







  • Ich hab das mit WMI geschafft.
    Leider ist ein WMI query 2 Sekunden lang.
    Wenn ich nach dem query abfrage, kommt immer derselbe Wert heraus.
    Bei einem AMD64 mit Cool'n'Quite ändert sich der Wert aber fortlaufend.
    Wie komme ich schneller an neue WMI Daten ?

    #ifndef _WIN32_DCOM
    #define _WIN32_DCOM
    #endif
    
    #include <windows.h>
    #include <objbase.h>
    #include <atlbase.h>
    #include <iostream>
    #include <wbemidl.h>
    #include <comutil.h>
    
    int main( int argc, char** argv )
    {
    	HRESULT hr = CoInitializeEx( NULL, COINIT_MULTITHREADED );
    
    	// setup process-wide security context
    	hr = CoInitializeSecurity( NULL, // we're not a server
    							   -1, // we're not a server
    							   NULL, // dito
    							   NULL, // reserved
    							   RPC_C_AUTHN_LEVEL_DEFAULT, // let DCOM decide
    							   RPC_C_IMP_LEVEL_IMPERSONATE,
    							   NULL,
    							   EOAC_NONE,
    							   NULL );
    
    	int result = 0;
    	// we're going to use CComPtr<>s, whose lifetime must end BEFORE CoUnitialize is called
    	{
    		// connect to WMI
    		CComPtr< IWbemLocator > locator;
    		hr = CoCreateInstance( CLSID_WbemAdministrativeLocator, NULL,
    							CLSCTX_INPROC_SERVER,
    							IID_IWbemLocator, reinterpret_cast< void** >( &locator ) );
    		if ( FAILED( hr ) )
    		{
    			std::cerr << "Instantiation of IWbemLocator failed" << std::endl;
    			return -1;
    		}
    
    		// connect to local service with current credentials
    		CComPtr< IWbemServices > service;
    		hr = locator->ConnectServer( L"root\\cimv2", NULL, NULL, NULL,
    									 WBEM_FLAG_CONNECT_USE_MAX_WAIT,
    									 NULL, NULL, &service );
    		if ( SUCCEEDED( hr ) )
    		{
    			// execute a query
    			CComPtr< IEnumWbemClassObject > enumerator;
    			[b]hr = service->ExecQuery( L"WQL", L"SELECT * FROM Win32_Processor",  <<<< dieser query braucht 2 sekunden :([/b]
    								     WBEM_FLAG_FORWARD_ONLY, NULL, &enumerator );
    			if ( SUCCEEDED( hr ) )
    			{
    				// read the first instance from the enumeration (only one on single processor machines)
    				CComPtr< IWbemClassObject > processor = NULL;
    				ULONG retcnt;
    				hr = enumerator->Next( WBEM_INFINITE, 1L, reinterpret_cast<IWbemClassObject**>( &processor ), &retcnt );
    				if ( SUCCEEDED( hr ) )
    				{
    					if ( retcnt > 0 )
    					{
    						// we have a processor installed :)
    						// now extract a property value
    						_variant_t var_val;
    						[b]hr = processor->Get( L"CurrentClockSpeed", 0, &var_val, NULL, NULL );[/b]      
                                                    [b]^^^ leider immer selber Wert wenn ich hier eine Schleife mache :([/b]
    						if ( SUCCEEDED( hr ) )
    						{
    							_bstr_t str = var_val;
    							[b]std::cout << "Processor speed: " << str << std::endl;[/b]
    						}
    					}
    				}
    			}
    		}
    	}
    	CoUninitialize();
    
    	return result;
    }
    


  • Steht auch in der Registry

    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) Get 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) Get Processor Speed
    
    RegQueryValueEx(hkey,"~MHz",0,0,(BYTE*)&processorspeed,&dwData);
    RegCloseKey(hkey);
    
    // Falls du die Geschwindigkeit in einem String brauchst
    ultoa(processorspeed,sendspeed,MAX_PATH);
    


  • nein, dort steht nur ein konstanter Wert.


Anmelden zum Antworten