sysinfo.c
来自「一本已经绝版的好书」· C语言 代码 · 共 263 行
C
263 行
/***********************************************************
Module name: SysInfo.C
Notices: Copyright (c) 1995-1997 Jeffrey Richter
***********************************************************/
#include "..\CmnHdr.H" /* See Appendix C. */
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#include <stdio.h>
#include "Resource.H"
///////////////////////////////////////////////////////////
// Set to TRUE if the app is running on Windows 95.
BOOL g_fWin95IsHost = FALSE;
///////////////////////////////////////////////////////////
// This function accepts a number and converts it to a
// string, inserting commas where appropriate.
LPTSTR BigNumToString (LONG lNum, LPTSTR szBuf) {
WORD wNumDigits = 0, wNumChars = 0;
do {
// Put the last digit of the string
// in the character buffer.
szBuf[wNumChars++] = (TCHAR) (lNum % 10 + __TEXT('0'));
// Increment the number of digits
// that we put in the string.
wNumDigits++;
// For every three digits put in
// the string, add a comma (,).
if (wNumDigits % 3 == 0)
szBuf[wNumChars++] = __TEXT(',');
// Divide the number by 10, and repeat the process.
lNum /= 10;
// Continue adding digits to the
// string until the number is zero.
} while (lNum != 0);
// If the last character added to
// the string was a comma, truncate it.
if (szBuf[wNumChars - 1] == __TEXT(','))
szBuf[wNumChars - 1] = 0;
// Ensure that the string is zero-terminated.
szBuf[wNumChars] = 0;
// We added all the characters to the string in
// reverse order. We must reverse the contents
// of the string.
_tcsrev(szBuf);
// Returns the address of the string. This is the same
// value that was passed to us initially. Returning it
// here makes it easier for the calling function to
// use the string.
return(szBuf);
}
///////////////////////////////////////////////////////////
void ShowCPUInfo (HWND hwnd,
WORD wProcessorArchitecture, WORD wProcessorLevel,
WORD wProcessorRevision) {
TCHAR szCPUArch[64];
TCHAR szCPULevel[64];
TCHAR szCPURev[64];
szCPULevel[0] = 0;
szCPURev[0] = 0;
switch (wProcessorArchitecture) {
case PROCESSOR_ARCHITECTURE_INTEL:
lstrcpy(szCPUArch, __TEXT("Intel"));
switch (wProcessorLevel) {
case 3: case 4:
wsprintf(szCPULevel, __TEXT("80%c86"),
wProcessorLevel + '0');
if (!g_fWin95IsHost)
wsprintf(szCPURev, __TEXT("%c%d"),
HIBYTE(wProcessorRevision) + __TEXT('A'),
LOBYTE(wProcessorRevision));
else
lstrcpy(szCPURev, __TEXT("(unknown)"));
break;
case 5:
wsprintf(szCPULevel, __TEXT("Pentium"));
if (!g_fWin95IsHost)
wsprintf(szCPURev,
__TEXT("Model %d, Stepping %d"),
HIBYTE(wProcessorRevision),
LOBYTE(wProcessorRevision));
else
lstrcpy(szCPURev, __TEXT("(unknown)"));
break;
}
break;
case PROCESSOR_ARCHITECTURE_MIPS:
lstrcpy(szCPUArch, __TEXT("MIPS"));
wsprintf(szCPULevel, __TEXT("R%04d"),
LOBYTE(wProcessorLevel) * 1000);
wsprintf(szCPURev, __TEXT("%d"),
LOBYTE(wProcessorRevision));
break;
case PROCESSOR_ARCHITECTURE_ALPHA:
lstrcpy(szCPUArch, __TEXT("Alpha"));
wsprintf(szCPULevel, __TEXT("%d"), wProcessorLevel);
wsprintf(szCPURev, __TEXT("Model %c, Pass %d"),
HIBYTE(wProcessorRevision) + __TEXT('A'),
LOBYTE(wProcessorRevision));
break;
case PROCESSOR_ARCHITECTURE_PPC:
lstrcpy(szCPUArch, __TEXT("PowerPC"));
switch (wProcessorLevel) {
case 1: case 3: case 4: case 20:
wsprintf(szCPULevel, __TEXT("%d"),
600 + wProcessorLevel);
break;
case 6:
wsprintf(szCPULevel, __TEXT("603+"),
wProcessorLevel);
break;
case 9:
wsprintf(szCPULevel, __TEXT("604+"),
wProcessorLevel);
break;
}
wsprintf(szCPURev, __TEXT("%d.%d"),
HIBYTE(wProcessorRevision),
LOBYTE(wProcessorRevision));
break;
case PROCESSOR_ARCHITECTURE_UNKNOWN:
default:
wsprintf(szCPUArch, __TEXT("Unknown"));
break;
}
SetDlgItemText(hwnd, IDC_PROCARCH, szCPUArch);
SetDlgItemText(hwnd, IDC_PROCLEVEL, szCPULevel);
SetDlgItemText(hwnd, IDC_PROCREV, szCPURev);
}
///////////////////////////////////////////////////////////
BOOL Dlg_OnInitDialog (HWND hwnd, HWND hwndFocus,
LPARAM lParam) {
TCHAR szBuf[50];
SYSTEM_INFO sinf;
// Associate an icon with the dialog box.
chSETDLGICONS(hwnd, IDI_SYSINFO, IDI_SYSINFO);
GetSystemInfo(&sinf);
if (g_fWin95IsHost) {
sinf.wProcessorLevel = (WORD)
(sinf.dwProcessorType / 100);
}
ShowCPUInfo(hwnd, sinf.wProcessorArchitecture,
sinf.wProcessorLevel, sinf.wProcessorRevision);
SetDlgItemText(hwnd, IDC_PAGESIZE,
BigNumToString(sinf.dwPageSize, szBuf));
SetDlgItemText(hwnd, IDC_MINAPPADDR,
BigNumToString((LONG) sinf.lpMinimumApplicationAddress,
szBuf));
SetDlgItemText(hwnd, IDC_MAXAPPADDR,
BigNumToString((LONG) sinf.lpMaximumApplicationAddress,
szBuf));
_stprintf(szBuf, __TEXT("0x%08X"),
sinf.dwActiveProcessorMask);
SetDlgItemText(hwnd, IDC_ACTIVEPROCMASK, szBuf);
SetDlgItemText(hwnd, IDC_NUMOFPROCS,
BigNumToString(sinf.dwNumberOfProcessors, szBuf));
SetDlgItemText(hwnd, IDC_ALLOCGRAN,
BigNumToString(sinf.dwAllocationGranularity, szBuf));
return(TRUE);
}
///////////////////////////////////////////////////////////
void Dlg_OnCommand (HWND hwnd, int id, HWND hwndCtl,
UINT codeNotify) {
switch (id) {
case IDCANCEL:
EndDialog(hwnd, id);
break;
}
}
///////////////////////////////////////////////////////////
BOOL CALLBACK Dlg_Proc (HWND hDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam) {
BOOL fProcessed = TRUE;
switch (uMsg) {
chHANDLE_DLGMSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
chHANDLE_DLGMSG(hDlg, WM_COMMAND, Dlg_OnCommand);
default:
fProcessed = FALSE;
break;
}
return(fProcessed);
}
///////////////////////////////////////////////////////////
int WINAPI _tWinMain (HINSTANCE hinstExe,
HINSTANCE hinstPrev, LPTSTR pszCmdLine, int nCmdShow) {
OSVERSIONINFO osvi;
chWARNIFUNICODEUNDERWIN95();
osvi.dwOSVersionInfoSize = sizeof(osvi);
GetVersionEx(&osvi);
g_fWin95IsHost =
(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);
DialogBox(hinstExe, MAKEINTRESOURCE(IDD_SYSINFO),
NULL, Dlg_Proc);
return(0);
}
/////////////////////// End Of File ///////////////////////
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?