vc获取硬盘物理序列号

来源:互联网 发布:按网络的覆盖区域分为 编辑:程序博客网 时间:2024/05/21 06:20

#pragma once

#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif

#include "resource.h"// 主符号


// CgetinfoApp:
//
有关此类的实现,请参阅 getinfo.cpp
//

class CgetinfoApp : public CWinApp
{
public:
CgetinfoApp();

// 重写
public:
virtual BOOL InitInstance();

// 实现

DECLARE_MESSAGE_MAP()
};

extern CgetinfoApp theApp;

// getinfoDlg.h : 头文件
//

#pragma once


// CgetinfoDlg 对话框
class CgetinfoDlg : public CDialog
{
//
构造
public:
CgetinfoDlg(CWnd* pParent = NULL);//
标准构造函数

// 对话框数据
enum { IDD = IDD_GETINFO_DIALOG };

protected:
virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持


// 实现
protected:
HICON m_hIcon;

// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
};

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by getinfo.RC
//
#define IDR_MAINFRAME128
#define IDM_ABOUTBOX0x0010
#define IDD_ABOUTBOX100
#define IDS_ABOUTBOX101
#define IDD_GETINFO_DIALOG102
#define IDR_MANIFESTCREATEPROCESS_MANIFEST_RESOURCE_ID

// 新对象的下一组默认值
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE129
#define _APS_NEXT_CONTROL_VALUE1000
#define _APS_NEXT_SYMED_VALUE101
#define _APS_NEXT_COMMAND_VALUE32771
#endif
#endif


// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 项目特定的包含文件

#pragma once

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN// 从 Windows 标头中排除不常使用的资料

#endif

// 如果您必须使用下列所指定的平台之前的平台,则修改下面的定义。
// 有关不同平台的相应值的最新信息,请参考 MSDN。
#ifndef WINVER// 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。
#define WINVER 0x0400//为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif

#ifndef _WIN32_WINNT// 允许使用 Windows NT 4 或更高版本的特定功能。
#define _WIN32_WINNT 0x0400//为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif

#ifndef _WIN32_WINDOWS// 允许使用 Windows 98 或更高版本的特定功能。
#define _WIN32_WINDOWS 0x0410 //为 Windows Me 及更新版本改变为适当的值。
#endif

#ifndef _WIN32_IE// 允许使用 IE 4.0 或更高版本的特定功能。
#define _WIN32_IE 0x0400//为 IE 5.0 及更新版本改变为适当的值。
#endif

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS// 某些 CString 构造函数将是显式的

// 关闭 MFC 对某些常见但经常被安全忽略的警告消息的隐藏
#define _AFX_ALL_WARNINGS

#include <afxwin.h>         // MFC 核心和标准组件
#include <afxext.h>         // MFC 扩展
#include <afxdisp.h>        // MFC 自动化类

#include <afxdtctl.h>// Internet Explorer 4 公共控件的 MFC 支持
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>// Windows
公共控件的 MFC 支持
#endif // _AFX_NO_AFXCMN_SUPPORT

// getinfo.cpp : 定义应用程序的类行为。
//

#include "stdafx.h"
#include "getinfo.h"
#include "getinfoDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CgetinfoApp

BEGIN_MESSAGE_MAP(CgetinfoApp, CWinApp)
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()


// CgetinfoApp 构造

CgetinfoApp::CgetinfoApp()
{
// TODO: 在此处添加构造代码,

// 将所有重要的初始化放置在 InitInstance 中
}


// 唯一的一个 CgetinfoApp 对象

CgetinfoApp theApp;


// CgetinfoApp 初始化

BOOL CgetinfoApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要

// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControls()。否则,将无法创建窗口。
InitCommonControls();

CWinApp::InitInstance();

AfxEnableControlContainer();


CgetinfoDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO
:在此放置处理何时用“确定”来关闭
//对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO
:在此放置处理何时用“取消”来关闭
//对话框的代码
}

// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}


// getinfoDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "getinfo.h"
#include "getinfoDlg.h"

//下面两句是我们增加的
#include "MMSystem.h"

#pragma comment(lib,"Winmm.lib")


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

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

// 对话框数据
enum { IDD = IDD_ABOUTBOX };

protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
DECLARE_MESSAGE_MAP()
};

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

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

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CgetinfoDlg 对话框

CgetinfoDlg::CgetinfoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CgetinfoDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CgetinfoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CgetinfoDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDOK, OnBnClickedOk)
END_MESSAGE_MAP()


// CgetinfoDlg 消息处理程序

BOOL CgetinfoDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// 将\“关于...\”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE);// 设置大图标
SetIcon(m_hIcon, FALSE);// 设置小图标

// TODO:在此添加额外的初始化代码

return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
}

void CgetinfoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CgetinfoDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CgetinfoDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}

void CgetinfoDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码

CString cs;
FILE *fp;
fp = fopen("c:\\getinfo.ini","w+");

//获得CPU的信息
char s[20];

//结构LPSYSTEM_INFO包含当前计算机信息,包括处理器的结构、类型和数量等。
LPSYSTEM_INFO mysys;
mysys = new SYSTEM_INFO;

GetSystemInfo(mysys);

// dwNumberOfProcessors为系统中CPU的数量。
_itoa(mysys->dwNumberOfProcessors,s,10);
cs.Format("CPU
的数量为:%s\n",s);
fwrite(cs,1,cs.GetLength(),fp);

// dwProcessorType为CPU的类型。
_itoa(mysys->dwProcessorType,s,10);
cs.Format("CPU
的类型为:%s\n",s);
fwrite(cs,1,cs.GetLength(),fp);

switch (mysys->wProcessorLevel)
{
 case 3:
   cs = "Intel 80386";
break;
case 4:
cs = "Intel 80486";
break;
 case 5:
cs = "Pentium";
break;
 default:
cs = "未知的
CPU";
break;
}

cs = "CPU的型号为:" + cs + "\n";
fwrite(cs,1,cs.GetLength(),fp);

// wProcessorRevision为CPU的修订版本。Windows 95/98系统不用。
_itoa(mysys->wProcessorRevision,s,10);
cs.Format("CPU
的修订版本为:%s\n",s);
fwrite(cs,1,cs.GetLength(),fp);

delete mysys;

//获取内存情况
//结构MEMORYSTATUS包含了物理内存和虚拟内存的当前状态。
MEMORYSTATUS *mymem;

//获得系统内存情况
mymem = new MEMORYSTATUS;
mymem->dwLength = sizeof(mymem); //
初始化
GlobalMemoryStatus(mymem);

// dwMemoryLoad标识当前内存可利用率,取值在0到100之间。
_itoa(mymem->dwMemoryLoad,s,10);

//内存可利用率
   cs.Format("当前可用内存的百分比:%s%%\n",s);
fwrite(cs,1,cs.GetLength(),fp);

// dwTotalPhys为实际整个物理内存的容量,以字节为单位。
_itoa(mymem->dwTotalPhys/1024,s,10);

//物理内存总量,以KB为单位
cs.Format("物理总量为:%s KB\n",s);
fwrite(cs,1,cs.GetLength(),fp);

// dwTotalPageFile为全部页面文件大小,以字节为单位。
_itoa(mymem->dwTotalPageFile/1024,s,10);

//页面文件的大小,以KB为单位
cs.Format("页面文件的大小:%s KB\n",s);
fwrite(cs,1,cs.GetLength(),fp);

// dwAvailPageFile为可用的页面文件大小,以字节为单位。
_itoa(mymem->dwAvailPageFile/1024,s,10);

//可用页面文件大小,以KB为单位
cs.Format("可用页面文件大小:%s KB\n",s);
fwrite(cs,1,cs.GetLength(),fp);

// dwTotalVirtual所有用户进程的虚拟内存大小,以字节为单位。
   _itoa(mymem->dwTotalVirtual/1024,s,10);

//虚拟内存总量,以KB为单位
cs.Format("虚拟内存总量:%s KB\n",s);
fwrite(cs,1,cs.GetLength(),fp);

// dwAvailVirtual为可用虚拟内存大小。
_itoa(mymem->dwAvailVirtual/1024,s,10);

//可用虚拟内存大小,以KB为单位
cs.Format("可用虚拟内存大小:%s KB\n",s);
fwrite(cs,1,cs.GetLength(),fp);

delete mymem;


//获得磁盘情况
DWORD sector, byte, cluster, free;
long int freespace,totalspace;
UINT type;
char name;
//0
—未知盘、1—不存在、2—可移动磁盘、3—固定磁盘、4—网络磁盘、
//5—CD-ROM、6—内存虚拟盘

char volname[255], filename[100];
DWORD sno, maxl, fileflag;

//循环检测A~Z
for (name = 'A'; name <= 'Z'; name++)
{
    //获得磁盘类型

cs.Format("%c:",name);
type = GetDriveType(cs);


switch(type)
{
case DRIVE_UNKNOWN:
cs.Format("
未知类型磁盘:%c\n",name);
      fwrite(cs,cs.GetLength(),1,fp);
break;

  case DRIVE_REMOVABLE:
       cs.Format("可移动类型磁盘:
%c\n",name);
       fwrite(cs,cs.GetLength(),1,fp);
break;

       case DRIVE_FIXED:
cs.Format("固定磁盘:
%c\n",name);
       fwrite(cs,cs.GetLength(),1,fp);
break;
           
case DRIVE_REMOTE:
cs.Format("网络映射磁盘:
%c\n",name);
           fwrite(cs,cs.GetLength(),1,fp);
break;
                 
case DRIVE_CDROM:
cs.Format("光驱:
%c\n",name);
      fwrite(cs,cs.GetLength(),1,fp);
break;

       case DRIVE_RAMDISK:
cs.Format("内存虚拟磁盘:
%c\n",name);
       fwrite(cs,cs.GetLength(),1,fp);
           break;

}

//获得磁盘容量信息
cs.Format("%c:\\",name);

//获得磁盘卷标和序号信息
if(GetVolumeInformation(cs, volname,255,&sno,&maxl,&fileflag,filename,100))
{
//
磁盘的卷标信息
cs.Format("%c盘卷标为:%s\n",name,volname);
    fwrite(cs,cs.GetLength(),1,fp);

//磁盘序号
cs.Format("%c盘序号为:%d\n",name,sno);
    fwrite(cs,cs.GetLength(),1,fp);


//计算磁盘剩余空间
//获得返回参数,其中cluster指磁盘总簇数,free指空余的簇数,sector指每簇扇区数,byte指每扇区字节数
    GetDiskFreeSpace(cs,&sector,&byte,&free,&cluster);

//计算总容量,以MB为单位
totalspace = cluster*byte*sector/1024/1024;  

//计算可用空间,以MB为单位
freespace = free*byte*sector/1024/1024;

//总空间
cs.Format("%c盘总空间(MB):%d\n",name,totalspace);
fwrite(cs,cs.GetLength(),1,fp);

//可用空间
cs.Format("%c盘可用空间(MB):%d\n",name,freespace);
fwrite(cs,cs.GetLength(),1,fp);
}

}

//获取音乐设备信息
int wavedevice,mididevice;
WAVEOUTCAPS wavecap;

// MIDIOUTCAPS结构体的成员跟WAVEOUTCAPS的差不多
MIDIOUTCAPS midicap;

//波形设备信息
wavedevice = (int)waveOutGetNumDevs();

// MIDI设备信息
mididevice = (int)midiOutGetNumDevs();  

//波形设备
if (wavedevice != 0)
{
waveOutGetDevCaps(0,&wavecap,sizeof(WAVEOUTCAPS));
cs.Format("
当前波形设备:%s\n",wavecap.szPname);
       fwrite(cs,cs.GetLength(),1,fp);
}

//MIDI设备
if (mididevice != 0)
{
midiOutGetDevCaps(0,&midicap,sizeof(MIDIOUTCAPS));
       cs.Format("
当前MIDI设备:%s\n",midicap.szPname);
       fwrite(cs,cs.GetLength(),1,fp);
}

//获取屏幕信息

//获得屏幕分辨率,x为水平像素,y为垂直像素。
int x = GetSystemMetrics(SM_CXSCREEN);
int y = GetSystemMetrics(SM_CYSCREEN);

cs.Format("当前分辨率为:%d * %d\n",x,y);
fwrite(cs,cs.GetLength(),1,fp);

//获得Windows信息
char windir[MAX_PATH];

//获得Windows目录
GetWindowsDirectory(windir,MAX_PATH);
cs.Format("Windows
所在的目录是:%s\n",windir);
fwrite(cs,cs.GetLength(),1,fp);

//获得Windows系统目录
GetSystemDirectory(windir,MAX_PATH);
cs.Format("Windows
的系统目录是:%s\n",windir);
fwrite(cs,cs.GetLength(),1,fp);

//结构OSVERSIONINFO包含操作系统的版本信息。
OSVERSIONINFO osvi;
CString os;

//获得操作系统信息
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx (&osvi);

switch(osvi.dwPlatformId)
{
case VER_PLATFORM_WIN32s:
os = "Windows 3.x";
break;
case VER_PLATFORM_WIN32_WINDOWS:
os = "Windows 95/98/Me";
break;
case VER_PLATFORM_WIN32_NT:
os = "Windows NT/2000/XP";
break;
default:
os = "未知的操作系统
";
break;
}

// dwMajorVersion为版本高位,dwMinorVersion为版本低位。例如:如果操作系统是Windows NT 3.52,则dwMajorVersion等于3,dwMinorVersion等于52。
//DwBuildNumber为操作传统的编译号。
cs.Format("操作系统是:%s,",os);
fwrite(cs,cs.GetLength(),1,fp);

cs.Format("版本号:%d.%d 编译号:%d",osvi.dwMajorVersion,osvi.dwMinorVersion,osvi.dwBuildNumber);
fwrite(cs,cs.GetLength(),1,fp);

fclose(fp);

OnOK();
}

// stdafx.cpp : 只包括标准包含文件的源文件
// getinfo.pch 将是预编译头
// stdafx.obj 将包含预编译类型信息

#include "stdafx.h"

 

原创粉丝点击