计算机软硬件信息获取程序实现
2008年9月22日星期一
最近从msdn上看到了获取系统软硬件信息的API和操作注册表的API,所以就编写了一个小的演示程序来实现,主要实现过程:通过一个登录框登录,其中用户名(默认Administrator)是在程序运行时自动在注册表中生成的,并在登录按钮中查询用户密码是否有效。当成功登录后,再初始化函数中实现系统软硬件信息获取并以树控件视图的形式显示出来。可以通过更新按钮来更新这些信息。可以通过保存信息按钮来将这些信息保存在ini配置文件(目前实现尚有缺陷)。可以通过添加新用户来添加用户信息,并保存在注册表中。可以通过更改用户密码按钮来修改用户密码,并保存在注册表中。程序运行图如下:
详细代码实现如下:
1. 定义的结构体类型
// 自定义结构体类型
struct DRIVER
{
// ULARGE_INTEGER为位数据类型
ULARGE_INTEGER nTotalNumberOfBytes; // 磁盘总共的空间
ULARGE_INTEGER nTotalNumberOfFreeBytes; // 磁盘空闲的空间
ULARGE_INTEGER nFreeBytesAvailable; // 用户可用的磁盘空间
};
struct DRIVER_INFO
{
char name[4]; // 驱动器盘符
DRIVER driver; // 驱动器详细信息
UINT nType; // 驱动器类型
};
// 定义硬件信息结构体
struct HARDWARE_INFO
{
SYSTEM_INFO processorInfo; // 处理器信息
MEMORYSTATUSEX memoryInfo; // 内存信息
DRIVER_INFO driverInfo[MAXNUM]; // 驱动器信息
};
// 定义软件信息结构体
struct SOFTWARE_INFO
{
OSVERSIONINFOEX OSVersion; // 操作系统版本信息
char computerName[32767]; // 计算机名
char userName[32767]; // 用户名
};
// 定义计算机信息结构体
struct COMPUTER_INFO
{
HARDWARE_INFO hardware; // 硬件信息
SOFTWARE_INFO software; // 软件信息
};
2. 主要模块关键代码实现:
函数CComputerInformationDemoApp::InitInstance()内实现
// 将用户登录信息写入注册表中(管理员)
HKEY hKey;
// 查找是否首次启动应用程序,如果不是则跳过下面两步
if (ERROR_SUCCESS != RegOpenKey(HKEY_LOCAL_MACHINE,_T("Software//ComputerInformationDemo"),&hKey))
{
// 创建一个注册表项
if (ERROR_SUCCESS == RegCreateKey(HKEY_LOCAL_MACHINE,_T("Software//ComputerInformationDemo"),&hKey))
{
// 设置注册表项的值
char psText[] = _T("111111");
if (ERROR_SUCCESS == RegSetValueEx(hKey,_T("Administrator"),0,REG_SZ,(const BYTE*)psText,6)) // 数据丢失
{
MessageBox(NULL,_T("Initial successful!"),NULL, 0);
}
}
}
RegCloseKey(hKey);
void CLoginDlg::OnLogin()
{
// 用户登录处理函数
CString strName,strPsw;
// 获取编辑框中输入的用户登录信息
m_Name.GetWindowText(strName);
m_Code.GetWindowText(strPsw);
// 从注册表中查找用户信息,并进行判断
HKEY hKey;
char *name;
char psw[20];
name = strName.GetBuffer();
DWORD dwType = REG_SZ;
DWORD dwSize = sizeof(psw);
if (ERROR_SUCCESS == RegOpenKey(HKEY_LOCAL_MACHINE,_T("Software//ComputerInformationDemo"),&hKey))
{
// DWORD dw = RegQueryValue(hKey,name,&psw,&lSize);
if (ERROR_SUCCESS == RegQueryValueEx(hKey,name,0,&dwType,(LPBYTE)psw,&dwSize))
{
// 比较密码是否相符
CString strpsw;
strpsw.Format(_T("%s"),psw);
if (strPsw == strpsw)
{
// 如果是授权用户,则打开主对话框
CComputerInformationDemoDlg dlg;
dlg.DoModal();
}
else
{
MessageBox(_T("无效用户"), 0, 0);
}
}
else
{
MessageBox(_T("RegQueryValue() failed!"), 0, 0);
}
}
else
{
MessageBox(_T("RegOpenKey() failed!"), 0, 0);
}
OnOK();
}
函数CComputerInformationDemoDlg::OnInitDialog()中实现:
// 获取计算机的基本信息并显示在树控件中
memset(&m_computerInfo,0,sizeof(COMPUTER_INFO));
if (!GetSysInfo(&m_computerInfo))
{
MessageBox(_T("GetSysInfo() failed!"), 0, 0);
return FALSE;
}
// 构建树视图
m_ImageList.Create(16,16,ILC_MASK,4,1);
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); // AfxGetApp()用来获取应用程序句柄
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_ImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
HICON hIcon=::LoadIcon(AfxGetResourceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); // AfxGetResourceHandle()用来获取资源句柄,MAKEINTRESOURCE是一个资源名转换的宏
m_Tree.SetImageList(&m_ImageList,LVSIL_NORMAL);
ShowSysInfo(&m_computerInfo);
void CComputerInformationDemoDlg::OnBnClickedButupdate()
{
// 更新操作系统信息
memset(&m_computerInfo,0,sizeof(COMPUTER_INFO));
if (!GetSysInfo(&m_computerInfo))
{
MessageBox(_T("Update failed!"), 0, 0);
return;
}
m_Tree.DeleteAllItems();
ShowSysInfo(&m_computerInfo);
return;
}
void CComputerInformationDemoDlg::OnBnClickedButsave()
{
// 保存操作系统信息到本地ini配置文件
HANDLE hFile;
// 先检查是否存在配置文件,如果没有则创建一个
hFile = CreateFile(fileName,
GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_NEW,0,NULL);
CloseHandle(hFile);
// 将系统信息写入配置文件中
// 遍历树(二叉树遍历),并将数据写入配置文件
// void PreOrderTraverseTreeCtrl(HTREEITEM root);
PreOrderTraverseTreeCtrl(m_Root);
}
void CComputerInformationDemoDlg::OnBnClickedButadd()
{
// 添加新用户登录信息
CAddNewNameDlg dlg;
dlg.DoModal();
}
void CComputerInformationDemoDlg::OnBnClickedButabout()
{
// 关于本软件信息
CAboutDlg dlg;
dlg.DoModal();
}
void CComputerInformationDemoDlg::OnBnClickedButchangepsw()
{
// 更改用户密码
CChangePSW dlg;
dlg.DoModal();
}
3. 特殊函数代码实现:
是
///
//
// 函数:BOOL GetSysInfo(COMPUTER_INFO* pComputerInfo);
// 描述:Get the system information
// 参数:use pComputerInfo to output the computer information
//
///
BOOL CComputerInformationDemoDlg::GetSysInfo(COMPUTER_INFO* pComputerInfo)
{
// 获取硬件信息//--------------------------------------------------------------------------------------
// 获取处理器信息
SYSTEM_INFO systemInfo;
memset(&systemInfo,0,sizeof(SYSTEM_INFO));
GetSystemInfo(&systemInfo);
// dwOemId:已废弃的成员,保留这个成员是为了向以前版本的Windows NT保持兼容
pComputerInfo->hardware.processorInfo.dwOemId = systemInfo.dwOemId;
// wProcessorArchitecture:指定系统中的中央处理器的体系结构
pComputerInfo->hardware.processorInfo.wProcessorArchitecture = systemInfo.wProcessorArchitecture;
// dwPageSize:指定页面的大小和页面保护和委托的颗粒,这是被VirtualAlloc 函数使用的页大小
pComputerInfo->hardware.processorInfo.dwPageSize = systemInfo.dwPageSize;
// lpMinimumApplicationAddress:指向应用程序和动态链接库(DLL)可以访问的最低内存地址
pComputerInfo->hardware.processorInfo.lpMinimumApplicationAddress = systemInfo.lpMinimumApplicationAddress;
// lpMaxmumApplicationAddress:指向应用程序和动态链接库(DLL)可以访问的最高内存地址
pComputerInfo->hardware.processorInfo.lpMaximumApplicationAddress = systemInfo.lpMaximumApplicationAddress;
// dwActiveProcessorMask:指定一个用来代表这个系统中装配了的中央处理器的掩码
pComputerInfo->hardware.processorInfo.dwActiveProcessorMask = systemInfo.dwActiveProcessorMask;
// dwNumberOfProcessors:指定系统中的处理器的数目
pComputerInfo->hardware.processorInfo.dwNumberOfProcessors = systemInfo.dwNumberOfProcessors;
// dwProcessorType:指定系统中中央处理器的类型
pComputerInfo->hardware.processorInfo.dwProcessorType = systemInfo.dwProcessorType;
// dwAllocationoGranularity:指定已经被分配的虚拟内存空间的粒度
pComputerInfo->hardware.processorInfo.dwAllocationGranularity = systemInfo.dwAllocationGranularity;
pComputerInfo->hardware.processorInfo.wProcessorLevel = systemInfo.wProcessorLevel;
pComputerInfo->hardware.processorInfo.wProcessorRevision = systemInfo.wProcessorRevision;
// 获取内存信息
MEMORYSTATUSEX memoryInfo;
memset(&memoryInfo,0,sizeof(MEMORYSTATUSEX));
memoryInfo.dwLength = sizeof(memoryInfo);
if (!GlobalMemoryStatusEx(&memoryInfo))
return FALSE;
pComputerInfo->hardware.memoryInfo.dwLength = memoryInfo.dwLength;
// dwMemoryLoad:内存使用率
pComputerInfo->hardware.memoryInfo.dwMemoryLoad = memoryInfo.dwMemoryLoad;
// ullTotalPhys:总共物理内存
pComputerInfo->hardware.memoryInfo.ullTotalPhys = memoryInfo.ullTotalPhys;
// ullAvailPhys:可用物理内存
pComputerInfo->hardware.memoryInfo.ullAvailPhys = memoryInfo.ullAvailPhys;
// ullTotalPageFile:全部内存
pComputerInfo->hardware.memoryInfo.ullTotalPageFile = memoryInfo.ullTotalPageFile;
// ullAvailPageFile:全部可用内存
pComputerInfo->hardware.memoryInfo.ullAvailPageFile = memoryInfo.ullAvailPageFile;
// ullTotalVirtual:全部虚拟内存
pComputerInfo->hardware.memoryInfo.ullTotalVirtual = memoryInfo.ullTotalVirtual;
// ullAvailVirtual:全部可用虚拟内存
pComputerInfo->hardware.memoryInfo.ullAvailVirtual = memoryInfo.ullAvailVirtual;
// 获取驱动器信息
DWORD nBufferLen = GetLogicalDriveStrings(0,NULL); // 获取驱动器的个数
nDriverNum = nBufferLen/4;
char szBuffer[MAXNUM*4];
memset(szBuffer,0,MAXNUM*4);
if (!GetLogicalDriveStrings(nBufferLen,(LPSTR)szBuffer))
return FALSE;
for (int i = 0; i < nDriverNum; i++)
{
char szTemp[4];
for (int j = 0; j < 4; j++)
{
szTemp[j] = szBuffer[j + 4*i];
}
for (int k = 0; k < 4; k++)
{
pComputerInfo->hardware.driverInfo[i].name[k] = szTemp[k];
}
UINT nType = GetDriveType(szTemp);
pComputerInfo->hardware.driverInfo[i].nType = nType;
// 64位数据类型
ULARGE_INTEGER nTotalNumberOfBytes,nTotalNumberOfFreeBytes,nFreeBytesAvailable;
if (!GetDiskFreeSpaceEx(szTemp,&nFreeBytesAvailable,&nTotalNumberOfBytes,&nTotalNumberOfFreeBytes))
{
continue;
}
pComputerInfo->hardware.driverInfo[i].driver.nTotalNumberOfBytes = nTotalNumberOfBytes;
pComputerInfo->hardware.driverInfo[i].driver.nTotalNumberOfFreeBytes = nTotalNumberOfFreeBytes;
pComputerInfo->hardware.driverInfo[i].driver.nFreeBytesAvailable = nFreeBytesAvailable;
}
// 软件信息//-----------------------------------------------------------------------------------------
// 获取操作系统版本信息
OSVERSIONINFOEX OSVersion;
ZeroMemory(&OSVersion, sizeof(OSVERSIONINFO));
OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
if (!GetVersionEx((LPOSVERSIONINFOA)&OSVersion))
return FALSE;
pComputerInfo->software.OSVersion = OSVersion;
// 获取计算机名
char computerName[INFO_BUFFER_SIZE];
memset(computerName,0,INFO_BUFFER_SIZE);
DWORD dwSize = INFO_BUFFER_SIZE;
if (!GetComputerName(computerName,&dwSize))
return FALSE;
int u = 0;
while(computerName[u] != '/0')
{
pComputerInfo->software.computerName[u] = computerName[u];
u++;
}
// 获取用户名
char userName[INFO_BUFFER_SIZE];
memset(userName,0,INFO_BUFFER_SIZE);
if (!GetUserName(userName,&dwSize))
return FALSE;
int v = 0;
while (userName[v] != '/0')
{
pComputerInfo->software.userName[v] = userName[v];
v++;
}
return TRUE;
}
/
//
// 函数:void ShowSysInfo(COMPUTER_INFO* pComputerInfo);
// 描述:Show the system information through the tree control
// 参数:use pComputerInfo to input the computer information
//
/
void CComputerInformationDemoDlg::ShowSysInfo(COMPUTER_INFO* pComputerInfo)
{
// 将系统信息显示在树控件中
m_Root=m_Tree.InsertItem(_T("计算机软硬件信息"),0,0);
// 显示硬件信息//--------------------------------------------------------------------------------------
m_Child1=m_Tree.InsertItem(_T("硬件信息"),1,1,m_Root);
// 显示处理器信息
CString strText;
strText = _T("处理器");
m_Child2=m_Tree.InsertItem(strText,2,2,m_Child1);
strText.Empty();
SYSTEM_INFO systemInfo;
strText = _T("处理器体系结构:");
systemInfo.wProcessorArchitecture = pComputerInfo->hardware.processorInfo.wProcessorArchitecture;
switch (systemInfo.wProcessorArchitecture)
{
case 9:
strText += _T("x64 (AMD or Intel)");
break;
case 6:
strText += _T("Intel Itanium Processor Family (IPF)");
break;
case 0:
strText += _T("x86");
break;
default:
strText += _T("Unknown architecture");
break;
}
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
systemInfo.dwPageSize = pComputerInfo->hardware.processorInfo.dwPageSize;
strText.Format(_T("%lu"),systemInfo.dwPageSize);
strText = _T("页面大小:") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
systemInfo.lpMinimumApplicationAddress = pComputerInfo->hardware.processorInfo.lpMinimumApplicationAddress;
strText.Format(_T("%d"),systemInfo.lpMinimumApplicationAddress);
strText = _T("应用程序和DLL可以访问的最低内存地址:") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
systemInfo.lpMaximumApplicationAddress = pComputerInfo->hardware.processorInfo.lpMaximumApplicationAddress;
strText.Format(_T("%d"),systemInfo.lpMaximumApplicationAddress);
strText = _T("应用程序和DLL可以访问的最高内存地址:") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
systemInfo.dwNumberOfProcessors = pComputerInfo->hardware.processorInfo.dwNumberOfProcessors;
strText.Format(_T("%lu"),systemInfo.dwNumberOfProcessors);
strText = _T("处理器数目:") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
strText = _T("处理器类型:");
systemInfo.dwProcessorType = pComputerInfo->hardware.processorInfo.dwProcessorType;
switch (systemInfo.dwProcessorType)
{
case 386:
strText += _T("PROCESSOR_INTEL_386");
break;
case 486:
strText += _T("PROCESSOR_INTEL_486");
break;
case 586:
strText += _T("PROCESSOR_INTEL_PENTIUM");
break;
case 2200:
strText += _T("PROCESSOR_INTEL_IA64");
break;
case 8664:
strText += _T("PROCESSOR_AMD_X8664");
break;
default:
strText += _T("UNKNOW");
break;
}
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
// 显示内存信息
strText.Empty();
strText = _T("内存");
m_Child2=m_Tree.InsertItem(strText,2,2,m_Child1);
MEMORYSTATUSEX memoryInfo;
strText.Empty();
memoryInfo.dwMemoryLoad = pComputerInfo->hardware.memoryInfo.dwMemoryLoad;
strText.Format(_T("%lu"),memoryInfo.dwMemoryLoad);
strText = _T("内存使用率:") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
memoryInfo.ullTotalPhys = pComputerInfo->hardware.memoryInfo.ullTotalPhys;
strText.Format(_T("%I64d"),memoryInfo.ullTotalPhys);
strText = _T("全部物理内存:") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
memoryInfo.ullAvailPhys = pComputerInfo->hardware.memoryInfo.ullAvailPhys;
strText.Format(_T("%I64d"),memoryInfo.ullAvailPhys);
strText = _T("全部可用物理内存:") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
memoryInfo.ullTotalPageFile = pComputerInfo->hardware.memoryInfo.ullTotalPageFile;
strText.Format(_T("%I64d"),memoryInfo.ullTotalPageFile);
strText = _T("全部内存:") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
memoryInfo.ullAvailPageFile = pComputerInfo->hardware.memoryInfo.ullAvailPageFile;
strText.Format(_T("%I64d"),memoryInfo.ullAvailPageFile);
strText = _T("全部可用内存:") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
memoryInfo.ullTotalVirtual = pComputerInfo->hardware.memoryInfo.ullTotalVirtual;
strText.Format(_T("%I64d"),memoryInfo.ullTotalVirtual);
strText = _T("全部虚拟内存:") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
memoryInfo.ullAvailVirtual = pComputerInfo->hardware.memoryInfo.ullAvailVirtual;
strText.Format(_T("%I64d"),memoryInfo.ullAvailVirtual);
strText = _T("全部可用虚拟内存:") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
// 显示驱动器信息
strText.Empty();
strText = _T("驱动器");
m_Child2=m_Tree.InsertItem(strText,2,2,m_Child1);
for (int i = 0; i < nDriverNum; i++)
{
strText.Empty();
strText.Format(_T("%s"),pComputerInfo->hardware.driverInfo[i].name);
UINT nType = pComputerInfo->hardware.driverInfo[i].nType;
switch (nType)
{
case DRIVE_FIXED:
strText = _T("硬盘") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
ULARGE_INTEGER nTotalNumberOfBytes_FIXED,nTotalNumberOfFreeBytes_FIXED,nFreeBytesAvailable_FIXED;
nTotalNumberOfBytes_FIXED = pComputerInfo->hardware.driverInfo[i].driver.nTotalNumberOfBytes;
strText.Format(_T("%I64d"),nTotalNumberOfBytes_FIXED);
strText = _T("全部空间大小:") + strText;
m_Child4=m_Tree.InsertItem(strText,4,4,m_Child3);
strText.Empty();
nTotalNumberOfFreeBytes_FIXED = pComputerInfo->hardware.driverInfo[i].driver.nTotalNumberOfFreeBytes;
strText.Format(_T("%I64d"),nTotalNumberOfFreeBytes_FIXED);
strText = _T("全部空闲空间大小:") + strText;
m_Child4=m_Tree.InsertItem(strText,4,4,m_Child3);
strText.Empty();
nFreeBytesAvailable_FIXED = pComputerInfo->hardware.driverInfo[i].driver.nFreeBytesAvailable;
strText.Format(_T("%I64d"),nFreeBytesAvailable_FIXED);
strText = _T("全部可用空闲空间大小:") + strText;
m_Child4=m_Tree.InsertItem(strText,4,4,m_Child3);
break;
case DRIVE_CDROM:
strText = _T("光驱") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
ULARGE_INTEGER nTotalNumberOfBytes_CDROM;
nTotalNumberOfBytes_CDROM = pComputerInfo->hardware.driverInfo[i].driver.nTotalNumberOfBytes;
strText.Format(_T("%I64d"),nTotalNumberOfBytes_CDROM);
strText = _T("全部空间大小:") + strText;
m_Child4=m_Tree.InsertItem(strText,4,4,m_Child3);
break;
case DRIVE_REMOVABLE:
strText = _T("可移动磁盘") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
strText.Empty();
ULARGE_INTEGER nTotalNumberOfBytes_REMOVEABLE,nTotalNumberOfFreeBytes_REMOVEABLE,nFreeBytesAvailable_REMOVEABLE;
nTotalNumberOfBytes_REMOVEABLE = pComputerInfo->hardware.driverInfo[i].driver.nTotalNumberOfBytes;
strText.Format(_T("%I64d"),nTotalNumberOfBytes_REMOVEABLE);
strText = _T("全部空间大小:") + strText;
m_Child4=m_Tree.InsertItem(strText,4,4,m_Child3);
strText.Empty();
nTotalNumberOfFreeBytes_REMOVEABLE = pComputerInfo->hardware.driverInfo[i].driver.nTotalNumberOfFreeBytes;
strText.Format(_T("%I64d"),nTotalNumberOfFreeBytes_REMOVEABLE);
strText = _T("全部空闲空间大小:") + strText;
m_Child4=m_Tree.InsertItem(strText,4,4,m_Child3);
strText.Empty();
nFreeBytesAvailable_REMOVEABLE = pComputerInfo->hardware.driverInfo[i].driver.nFreeBytesAvailable;
strText.Format(_T("%I64d"),nFreeBytesAvailable_REMOVEABLE);
strText = _T("全部可用空闲空间大小:") + strText;
m_Child4=m_Tree.InsertItem(strText,4,4,m_Child3);
break;
case DRIVE_REMOTE:
strText = _T("网络磁盘") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
break;
case DRIVE_RAMDISK:
strText = _T("虚拟磁盘") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
break;
case DRIVE_UNKNOWN:
strText = _T("未知设备") + strText;
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
break;
default:
break;
}
}
// 显示软件信息//------------------------------------------------------------------------------------
m_Child1=m_Tree.InsertItem(_T("软件信息"),1,1,m_Root);
// 显示操作系统信息
strText.Empty();
strText = _T("操作系统版本信息");
m_Child2=m_Tree.InsertItem(strText,2,2,m_Child1);
OSVERSIONINFOEX OSVersion;
memset(&OSVersion,0,sizeof(OSVERSIONINFOEX));
OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
OSVersion.dwBuildNumber = pComputerInfo->software.OSVersion.dwBuildNumber;
OSVersion.dwMajorVersion = pComputerInfo->software.OSVersion.dwMajorVersion;
OSVersion.dwMinorVersion = pComputerInfo->software.OSVersion.dwMinorVersion;
OSVersion.dwOSVersionInfoSize = pComputerInfo->software.OSVersion.dwOSVersionInfoSize;
OSVersion.dwPlatformId = pComputerInfo->software.OSVersion.dwPlatformId;
OSVersion.wProductType = pComputerInfo->software.OSVersion.wProductType;
OSVersion.wReserved = pComputerInfo->software.OSVersion.wReserved;
OSVersion.wServicePackMajor = pComputerInfo->software.OSVersion.wServicePackMajor;
OSVersion.wServicePackMinor = pComputerInfo->software.OSVersion.wServicePackMinor;
OSVersion.wSuiteMask = pComputerInfo->software.OSVersion.wSuiteMask;
int i = 0;
while(pComputerInfo->software.OSVersion.szCSDVersion[i])
{
OSVersion.szCSDVersion[i] = pComputerInfo->software.OSVersion.szCSDVersion[i];
i++;
}
LPTSTR pszOS = new char[BUFSIZE];
if ( VER_PLATFORM_WIN32_NT==OSVersion.dwPlatformId && OSVersion.dwMajorVersion > 4 )
{
StringCchCopy(pszOS, BUFSIZE, TEXT("Microsoft "));
if ( OSVersion.dwMajorVersion == 6 && OSVersion.dwMinorVersion == 0 )
{
if( OSVersion.wProductType == VER_NT_WORKSTATION )
StringCchCat(pszOS, BUFSIZE, TEXT("Windows Vista "));
else
StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 " ));
}
if ( OSVersion.dwMajorVersion == 5 && OSVersion.dwMinorVersion == 2 )
{
if( GetSystemMetrics(SM_SERVERR2) )
StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Server 2003 R2, "));
else if ( OSVersion.wSuiteMask==VER_SUITE_STORAGE_SERVER )
StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Storage Server 2003"));
else if( OSVersion.wProductType == VER_NT_WORKSTATION &&
systemInfo.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
{
StringCchCat(pszOS, BUFSIZE, TEXT( "Windows XP Professional x64 Edition"));
}
else
StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2003, "));
if ( OSVersion.wProductType != VER_NT_WORKSTATION )
{
if ( systemInfo.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 )
{
if( OSVersion.wSuiteMask & VER_SUITE_DATACENTER )
StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition for Itanium-based Systems" ));
else if( OSVersion.wSuiteMask & VER_SUITE_ENTERPRISE )
StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition for Itanium-based Systems" ));
}
else if ( systemInfo.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
{
if( OSVersion.wSuiteMask & VER_SUITE_DATACENTER )
StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter x64 Edition" ));
else if( OSVersion.wSuiteMask & VER_SUITE_ENTERPRISE )
StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise x64 Edition" ));
else StringCchCat(pszOS, BUFSIZE, TEXT( "Standard x64 Edition" ));
}
else
{
if ( OSVersion.wSuiteMask & VER_SUITE_COMPUTE_SERVER )
StringCchCat(pszOS, BUFSIZE, TEXT( "Compute Cluster Edition" ));
else if( OSVersion.wSuiteMask & VER_SUITE_DATACENTER )
StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition" ));
else if( OSVersion.wSuiteMask & VER_SUITE_ENTERPRISE )
StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition" ));
else if ( OSVersion.wSuiteMask & VER_SUITE_BLADE )
StringCchCat(pszOS, BUFSIZE, TEXT( "Web Edition" ));
else
StringCchCat(pszOS, BUFSIZE, TEXT( "Standard Edition" ));
}
}
}
if ( OSVersion.dwMajorVersion == 5 && OSVersion.dwMinorVersion == 1 )
{
StringCchCat(pszOS, BUFSIZE, TEXT("Windows XP "));
if( OSVersion.wSuiteMask & VER_SUITE_PERSONAL )
StringCchCat(pszOS, BUFSIZE, TEXT( "Home Edition" ));
else
StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" ));
}
if ( OSVersion.dwMajorVersion == 5 && OSVersion.dwMinorVersion == 0 )
{
StringCchCat(pszOS, BUFSIZE, TEXT("Windows 2000 "));
if ( OSVersion.wProductType == VER_NT_WORKSTATION )
{
StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" ));
}
else
{
if( OSVersion.wSuiteMask & VER_SUITE_DATACENTER )
StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Server" ));
else if( OSVersion.wSuiteMask & VER_SUITE_ENTERPRISE )
StringCchCat(pszOS, BUFSIZE, TEXT( "Advanced Server" ));
else
StringCchCat(pszOS, BUFSIZE, TEXT( "Server" ));
}
}
if( _tcslen(OSVersion.szCSDVersion) > 0 )
{
StringCchCat(pszOS, BUFSIZE, TEXT(" ") );
StringCchCat(pszOS, BUFSIZE, OSVersion.szCSDVersion);
}
TCHAR buf[80];
StringCchPrintf( buf, 80, TEXT(" (build %d)"), OSVersion.dwBuildNumber);
StringCchCat(pszOS, BUFSIZE, buf);
}
strText.Format(_T("%s"),pszOS);
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
// 显示计算机名
strText.Empty();
strText = _T("计算机名");
m_Child2=m_Tree.InsertItem(strText,2,2,m_Child1);
strText.Empty();
strText.Format(_T("%s"),pComputerInfo->software.computerName);
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
// 显示用户名
strText.Empty();
strText = _T("用户名");
m_Child2=m_Tree.InsertItem(strText,2,2,m_Child1);
strText.Empty();
strText.Format(_T("%s"),pComputerInfo->software.userName);
m_Child3=m_Tree.InsertItem(strText,3,3,m_Child2);
}
void CComputerInformationDemoDlg::PreOrderTraverseTreeCtrl(HTREEITEM root)
{
HTREEITEM Item = root;
while (NULL != Item)
{
while (m_Tree.ItemHasChildren(Item))
{
WriteItemToFile(Item);
Item = m_Tree.GetNextItem(Item,TVGN_CHILD);
}
WriteItemToFile(Item);
if (!m_Tree.GetNextSiblingItem(Item))
{
Item = m_Tree.GetParentItem(Item);
}
Item = m_Tree.GetNextSiblingItem(Item);
}
}
void CComputerInformationDemoDlg::WriteItemToFile(HTREEITEM Item)
{
HTREEITEM ParItem,PParItem;
CString strItem,strParItem,strPParItem;
int Flag;
if (m_Tree.GetParentItem(Item))
{
ParItem = m_Tree.GetParentItem(Item);
strParItem = m_Tree.GetItemText(ParItem);
if (m_Tree.GetParentItem(ParItem))
{
PParItem = m_Tree.GetParentItem(ParItem);
strPParItem = m_Tree.GetItemText(PParItem);
Flag = 1;
}
else
{
Flag = 0;
}
}
strItem = m_Tree.GetItemText(Item);
if (Flag == 0)
{
WritePrivateProfileString(_T("ComputerInformation"),_T("计算机软硬件信息"),strItem,fileName);
}
else
{
WritePrivateProfileString(strPParItem,strParItem,strItem,fileName);
}
}