📄 testharddlg.cpp
字号:
// 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 + -