⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testharddlg.cpp

📁 自己写的测试CPU频率
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// testhardDlg.cpp : implementation file
//

#include "stdafx.h"
#include "testhard.h"
#include "testhardDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTesthardDlg dialog

CTesthardDlg::CTesthardDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTesthardDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTesthardDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTesthardDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTesthardDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTesthardDlg, CDialog)
	//{{AFX_MSG_MAP(CTesthardDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTesthardDlg message handlers
struct COMPUTERINFO
{
	//	内存的信息
	LONG		physicsmemory;								//	总共物理内存
	LONG		virtualmemory;								//	总共虚拟内存
	LONG		freephysicsmemory;							//	未用物理内存
	LONG		freevirtualmemory;							//	未用虚拟内存
	//	CPU的信息
	int			cpus;										//	CPU的数目
	char		vendor_name[16];							//	CPU的制造商
    char		model_name[32];								//	CPU的名字,如Intel_Pentium_Pro等
    int			family;										//	CPU的家族号,如Intel_Pentium_Pro是第六代
    int			model;										//	CPU的型号,如Intel_Pentium_Pro是第六代的第一款
    int			stepping;									//	CPU的修订版本
    int			feature;									//	CPU的特性
	int			frequency;									//	CPU的频率
    int			os_support;									//	操作系统支持的特性    
	//	屏幕的信息
	int			screens;									//	总共的屏幕数
	int			colordepth;									//	屏幕的色深
	RECT		screen[8];									//	第N个屏幕可利用的位置
};

#define COMPILE_MULTIMON_STUBS
#include "shlwapi.h"
#include "multimon.h"
#include "mmsystem.h"
#pragma comment( lib,"shlwapi.lib" )
#pragma comment( lib,"winmm.lib" )


// These are the bit flags that get set on calling cpuid
// with register eax set to 1
#define _MMX_FEATURE_BIT        0x00800000
#define _SSE_FEATURE_BIT        0x02000000
#define _SSE2_FEATURE_BIT       0x04000000

// This bit is set when cpuid is called with
// register set to 80000001h (only applicable to AMD)
#define _3DNOW_FEATURE_BIT      0x80000000

int IsCPUID()
{
    __try {
        _asm
        {
            xor eax, eax
            cpuid
        }
    } __except ( EXCEPTION_EXECUTE_HANDLER) {
        return 0;
    }
    return 1;
}


/***
* int _os_support(int feature)
*   - Checks if OS Supports the capablity or not
*
* Entry:
*   feature: the feature we want to check if OS supports it.
*
* Exit:
*   Returns 1 if OS support exist and 0 when OS doesn't support it.
*
****************************************************************/
#ifdef _VC_SP4
	#define TESTSSE		xorps xmm0, xmm0
	#define TESTSSE2	xorpd xmm0, xmm0
	#define TEST3DNOW	pfrcp mm0,  mm0
	#define TESTMMX		pxor  mm0,  mm0
#else
	#define TESTSSE		__asm _emit 0x0f __asm _emit 0x57 __asm _emit 0xc0
	#define TESTSSE2	__asm _emit 0x66 __asm _emit 0x0f __asm _emit 0x57 __asm _emit 0xc0
	#define TEST3DNOW	__asm _emit 0x0f __asm _emit 0x0f __asm _emit 0xc0 __asm _emit 0x96
	#define TESTMMX		__asm pxor mm0, mm0 __asm emms
#endif
#define _CPU_FEATURE_MMX		0x0001
#define _CPU_FEATURE_SSE		0x0002
#define _CPU_FEATURE_SSE2		0x0004
#define _CPU_FEATURE_3DNOW		0x0008

int _os_support(int feature)
{

    __try
    {
        switch (feature)
        {
        case _CPU_FEATURE_SSE:
			TESTSSE
            break;
        case _CPU_FEATURE_SSE2:
			TESTSSE2
            break;
        case _CPU_FEATURE_3DNOW:
			TEST3DNOW
            break;
        case _CPU_FEATURE_MMX:
			TESTMMX

            break;
        }
    } __except (EXCEPTION_EXECUTE_HANDLER) {
        if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) {
            return (0);
        }
        return (0);
    }
    return 1;
}


/*------------------------------*/
/* 将类型转换为名字				*/
/*------------------------------*/
void map_mname( int family, int model, const char * v_name, char *m_name)
{
    if (!strncmp("AuthenticAMD", v_name, 12))
    {
        switch (family) // extract family code
        {
        case 4: // Am486/AM5x86
            strcpy (m_name,"AMD Am486");
            break;

        case 5: // K6
            switch (model) // extract model code
            {
            case 0:
            case 1:
            case 2:
            case 3: 
                strcpy (m_name,"AMD K5");
                break;
            case 4:
                break;  // Not really used
            case 5:
                break;  // Not really used
            case 6:
            case 7: 
                strcpy (m_name,"AMD K6");
                break;
            case 8:
                strcpy (m_name,"AMD K6-2");
                break;
            case 9: 
            case 10:
            case 11:
            case 12:
            case 13:
            case 14:
            case 15:
                strcpy (m_name,"AMD K6-3");
                break;
            default:
                strcpy (m_name, "Unknown");
            }
            break;

        case 6: // Athlon
            switch(model)  // No model numbers are currently defined
            {
            case 1:
            default:
                strcpy (m_name,"AMD ATHLON");
            }
            break;
        }
    } else if ( !strncmp("GenuineIntel", v_name, 12))
    {
        switch (family) // extract family code
        {
        case 4:
            switch (model) // extract model code
            {
            case 0:
            case 1:
                strcpy (m_name,"INTEL 486DX");
                break;
            case 2:
                strcpy (m_name,"INTEL 486SX");
                break;
            case 3:
                strcpy (m_name,"INTEL 486DX2");
                break;
            case 4:
                strcpy (m_name,"INTEL 486SL");
                break;
            case 5:
                strcpy (m_name,"INTEL 486SX2");
                break;
            case 7:
                strcpy (m_name,"INTEL 486DX2E");
                break;
            case 8:
                strcpy (m_name,"INTEL 486DX4");
                break;
            default:
                strcpy (m_name, "Unknown");
            }
            break;
        case 5:
            switch (model) // extract model code
            {
            case 1:
            case 2:
            case 3:
                strcpy (m_name,"INTEL Pentium");
                break;
            case 4:
                strcpy (m_name,"INTEL Pentium-MMX");
                break;
            default:
                strcpy (m_name, "Unknown");
            }
            break;
        case 6:
            switch (model) // extract model code
            {
            case 1:
                strcpy (m_name,"INTEL Pentium-Pro");
                break;
            case 3:
                strcpy (m_name,"INTEL Pentium-II"); break;
            case 5:
                strcpy (m_name,"INTEL Pentium-II");
                break;  // actual differentiation depends on cache settings
            case 6:
                strcpy (m_name,"INTEL Celeron");
                break;
            case 7:
			case 8:
                strcpy (m_name,"INTEL Pentium-III");
                break;  // actual differentiation depends on cache settings
            default:
                strcpy (m_name, "Unknown");
            }
            break;
		case 15:
			{
                strcpy (m_name,"INTEL Pentium-4");
			}
			break;
        }
    } else if ( !strncmp("CyrixInstead", v_name,12))
    {
        strcpy (m_name,"Unknown");
    } else if ( !strncmp("CentaurHauls", v_name,12))
    {
        strcpy (m_name,"Unknown");
    } else 
    {
        strcpy (m_name, "Unknown");
    }

}
/*------------------------------*/
/* 得到计算机信息				*/
/*------------------------------*/
#define RDTSC __asm _emit 0x0f __asm _emit 0x31

unsigned long rdtsc(void)
{
	unsigned long a;

	__asm
	{
		RDTSC			;get the count
		mov a, eax		;copy register
	}
	return a;
}

LPTSTR regCPUInfo		= "HKEY_LOCAL_MACHINE\\Hardware\\Description\\System\\CentralProcessor\\0";

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -