windows核心编程 第14章,虚拟内存:获取系统信息
14,获取系统消息
14.1 系统信息
许多操作系统的值是根据主机而定的,比如页面的大小,分配粒度的大小等。这些值决不应该用硬编码的形式放入你的源代码。相反,你始终都应该在进程初始化的时候检索这些值并在你的源代码中使用检索到的值。GetSystemInfo函数将用于检索与主机相关的值:
VOID GetSystemInfo(LPSYSTEM_INFO psinf):
必须传递SYSTEM_INFO结构的地址给这个函数。这个函数将初始化所有的结构成员然后返回。下面是SYSTEM INFO数据结构的样子
typedef struct _SYSTEM_INFO {
union {
DWORD dwOemId; // Obsolete field...do not use
struct {
WORD wProcessorArchitecture;
WORD wReserved;
} DUMMYSTRUCTNAME;
} DUMMYUNIONNAME;
DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD dwNumberOfProcessors;
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
} SYSTEM_INFO, * LPSYSTEM_INFO;
当系统引导时,它要确定这些成员的值是什么。对于任何既定的系统来说,这些值总是相同的,因此决不需要为任何既定的进程多次调用该函数。由于有了GetSystemInfo函数,因此应用程序能够在运行的时候查询这些值。在该结构的所有成员中,只有4个成员与内存有关。表14-1对这4个成员作了描述。
/******************************************************************************
14_SysInfo.cpp
显示SYSTEM_INFO结构体信息
******************************************************************************/
#include "CmnHdr.h" /* See Appendix A. */
#include <windowsx.h>
#include <tchar.h>
#include <stdio.h>
#include "Resource.h"
#include <StrSafe.h>
///
//将数据转换为字符,并用逗号分开
PTSTR BigNumToString(LONG lNum, PTSTR szBuf, DWORD chBufSize);
void ShowCPUInfo(HWND hWnd, WORD wProcessorArchitecture, WORD wProcessorLevel,
WORD wProcessorRevision);//显示CPU信息
void ShowBitness(HWND hWnd);//显示对话框标题
BOOL Dlg_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam);
void Dlg_OnCommand(HWND hWnd, int id, HWND hWndCtl, UINT codeNotify);
INT_PTR WINAPI Dlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
///
int WINAPI _tWinMain(HINSTANCE hInstExe, HINSTANCE, PTSTR, int) {
DialogBox(hInstExe, MAKEINTRESOURCE(IDD_SYSINFO), NULL, Dlg_Proc);
return(0);
}
INT_PTR WINAPI Dlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
chHANDLE_DLGMSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
chHANDLE_DLGMSG(hDlg, WM_COMMAND, Dlg_OnCommand);
}
return(FALSE);
}
BOOL Dlg_OnInitDialog(HWND hWnd, HWND hWndFocus, LPARAM lParam) {
chSETDLGICONS(hWnd, IDI_SYSINFO);
//获取系统信息
SYSTEM_INFO sinf;
GetSystemInfo(&sinf);
//显示CPU信息
ShowCPUInfo(hWnd, sinf.wProcessorArchitecture,
sinf.wProcessorLevel, sinf.wProcessorRevision);
//显示页面大小
TCHAR szBuf[50