aboutdlg.cpp

来自「《ATL深入解析》随书源码」· C++ 代码 · 共 659 行 · 第 1/2 页

CPP
659
字号
                    }

                case 6:                     // Intel Pentium Pro/II
                    LoadString (hinst,
                                IDS_PROCESSOR_ARCHITECTURE_INTEL_PENTIUM,
                                szFormat, DIM (szFormat)) ;
                    switch (HIBYTE(si.wProcessorRevision)) {
                    default:
                        FormatMessageFromString (
                            szFormat,
                            szBuffer, DIM (szBuffer),
                            TEXT ("Pentium Pro"),
                            HIBYTE (si.wProcessorRevision),
                            LOBYTE (si.wProcessorRevision)) ;
                    break ;
                    case 1:
                        FormatMessageFromString (
                            szFormat,
                            szBuffer, DIM (szBuffer),
                            TEXT ("Pentium Pro"),
                            HIBYTE (si.wProcessorRevision),
                            LOBYTE (si.wProcessorRevision)) ;
                    break ;
                    case 3:
                    case 5:
                        FormatMessageFromString (
                            szFormat,
                            szBuffer, DIM (szBuffer),
                            TEXT ("Pentium II"),
                            HIBYTE (si.wProcessorRevision),
                            LOBYTE (si.wProcessorRevision)) ;
                    break ;
                    }
            }
            break ;

        case PROCESSOR_ARCHITECTURE_MIPS:   // MIPS
            switch (si.wProcessorLevel) {   // 00xx - xx is 8-bit implementation #
                LoadString (hinst, IDS_PROCESSOR_ARCHITECTURE_MIPS,
                            szFormat, DIM (szFormat)) ;
                default:
                    bRecognized = FALSE ;
                    LoadString (hinst, IDS_PROCESSOR_LEVEL_MIPS_UNKNOWN,
                                szBuffer, DIM (szBuffer)) ;
                    break ;

                case 0x0004:                // MIPS R4000
                    FormatMessageFromString (
                        szFormat,
                        szBuffer, DIM (szBuffer),
                        TEXT ("R4000"),
                        LOBYTE (si.wProcessorRevision)) ;
                    break ;
            }
            break ;

        case PROCESSOR_ARCHITECTURE_ALPHA:  // Alpha
            LoadString (hinst, IDS_PROCESSOR_ARCHITECTURE_ALPHA,
                        szFormat, DIM (szFormat)) ;
            switch (si.wProcessorLevel) {   // xxxx - 16-bit processor version #
                default:
                    bRecognized = FALSE ;
                    LoadString (hinst, IDS_PROCESSOR_LEVEL_ALPHA_UNKNOWN,
                                szBuffer, DIM (szBuffer)) ;
                    break ;

                case 21064:                 // Alpha 21064
                    FormatMessageFromString (
                        szFormat,
                        szBuffer, DIM (szBuffer),
                        TEXT ("21064"),
                        (TCHAR)(HIBYTE (si.wProcessorRevision) + (TCHAR) 'A'),
                        LOBYTE (si.wProcessorRevision)) ;
                    break ;

                case 21066:                 // Alpha 21066
                    FormatMessageFromString (
                        szFormat,
                        szBuffer, DIM (szBuffer),
                        TEXT ("21066"),
                        (TCHAR)(HIBYTE (si.wProcessorRevision) + (TCHAR) 'A'),
                        LOBYTE (si.wProcessorRevision)) ;
                    break ;

                case 21164:                 // Alpha 21164
                    FormatMessageFromString (
                        szFormat,
                        szBuffer, DIM (szBuffer),
                        TEXT ("21164"),
                        (TCHAR)(HIBYTE (si.wProcessorRevision) + (TCHAR) 'A'),
                        LOBYTE (si.wProcessorRevision)) ;
                    break ;
            }
            break ;

        case PROCESSOR_ARCHITECTURE_PPC:    // Power PC
            LoadString (hinst, IDS_PROCESSOR_ARCHITECTURE_PPC,
                        szFormat, DIM (szFormat)) ;
            switch (si.wProcessorLevel) {   // xxxx - 16-bit processor version #
                default:
                    bRecognized = FALSE ;
                    LoadString (hinst, IDS_PROCESSOR_LEVEL_PPC_UNKNOWN,
                                szBuffer, DIM (szBuffer)) ;
                    break ;

                case 1:                     // Power PC 601
                    FormatMessageFromString (
                        szFormat,
                        szBuffer, DIM (szBuffer),
                        TEXT ("601"),
                        HIBYTE (si.wProcessorRevision),
                        LOBYTE (si.wProcessorRevision)) ;
                    break ;

                case 3:                     // Power PC 603
                    FormatMessageFromString (
                        szFormat,
                        szBuffer, DIM (szBuffer),
                        TEXT ("603"),
                        HIBYTE (si.wProcessorRevision),
                        LOBYTE (si.wProcessorRevision)) ;
                    break ;

                case 4:                     // Power PC 604
                    FormatMessageFromString (
                        szFormat,
                        szBuffer, DIM (szBuffer),
                        TEXT ("604"),
                        HIBYTE (si.wProcessorRevision),
                        LOBYTE (si.wProcessorRevision)) ;
                    break ;

                case 6:                     // Power PC 603+
                    FormatMessageFromString (
                        szFormat,
                        szBuffer, DIM (szBuffer),
                        TEXT ("603+"),
                        HIBYTE (si.wProcessorRevision),
                        LOBYTE (si.wProcessorRevision)) ;
                    break ;

                case 9:                     // Power PC 604+
                    FormatMessageFromString (
                        szFormat,
                        szBuffer, DIM (szBuffer),
                        TEXT ("604+"),
                        HIBYTE (si.wProcessorRevision),
                        LOBYTE (si.wProcessorRevision)) ;
                    break ;

                case 20:                    // Power PC 620
                    FormatMessageFromString (
                        szFormat,
                        szBuffer, DIM (szBuffer),
                        TEXT ("620"),
                        HIBYTE (si.wProcessorRevision),
                        LOBYTE (si.wProcessorRevision)) ;
                    break ;
            }
            break;

        case PROCESSOR_ARCHITECTURE_SHX:    // Hitachi SHx
            LoadString (hinst, IDS_PROCESSOR_ARCHITECTURE_SHX,
                        szFormat, DIM (szFormat)) ;
            break;
        case PROCESSOR_ARCHITECTURE_ARM:    // StrongArm
            LoadString (hinst, IDS_PROCESSOR_ARCHITECTURE_ARM,
                        szFormat, DIM (szFormat)) ;
            break;
        case PROCESSOR_ARCHITECTURE_IA64:   // IA64
            LoadString (hinst, IDS_PROCESSOR_ARCHITECTURE_IA64,
                        szFormat, DIM (szFormat)) ;
            break;
        case PROCESSOR_ARCHITECTURE_ALPHA64: // Alpha 64
            LoadString (hinst, IDS_PROCESSOR_ARCHITECTURE_ALPHA64,
                        szFormat, DIM (szFormat)) ;
            break ;
    }

    // If the processor type isn't yet recognized, check the, supposedly,
    // "obsolete" dwProcessorType field of the SYSTEM_INFO structure for
    // a reasonable value and use it.
    if (!bRecognized) {
        switch (si.dwProcessorType) {
            case PROCESSOR_INTEL_386:
                LoadString (hinst, IDS_PROCESSOR_NOREV_INTEL_386,
                            szBuffer, DIM (szBuffer)) ;
                break ;

            case PROCESSOR_INTEL_486:
                LoadString (hinst, IDS_PROCESSOR_NOREV_INTEL_486,
                            szBuffer, DIM (szBuffer)) ;
                break ;

            case PROCESSOR_INTEL_PENTIUM:
                LoadString (hinst, IDS_PROCESSOR_NOREV_INTEL_PENTIUM,
                            szBuffer, DIM (szBuffer)) ;
                break ;

            case PROCESSOR_MIPS_R4000:
                LoadString (hinst, IDS_PROCESSOR_NOREV_MIPS_R4000,
                            szBuffer, DIM (szBuffer)) ;
                break ;

            case PROCESSOR_ALPHA_21064:
                LoadString (hinst, IDS_PROCESSOR_NOREV_ALPHA_21064,
                            szBuffer, DIM (szBuffer)) ;
                break ;
        }
    }

    SetDlgItemText (hwnd, IDC_ABOUT_PROCESSORVERSION, szBuffer) ;
}

//
//  DWORD FormatMessageFromString (LPCTSTR szFormat, LPTSTR  szBuffer, DWORD nSize, ...)
//
//  szFormat        Format string containing message insertion markers
//  szBuffer        Output string buffer
//  nSize           Size of output string buffer
//  ...             Variable number of optional parameter
//                  
//
//  PURPOSE:        
//                  Convenient helper function for calling FormatMessage
//
//  COMMENTS:
//

static DWORD
FormatMessageFromString (LPCTSTR szFormat, LPTSTR  szBuffer, DWORD nSize, ...)
{
    DWORD               dwRet ;
    va_list             marker ;

    va_start (marker, nSize) ;              // Initialize variable arguments

    dwRet = FormatMessage (FORMAT_MESSAGE_FROM_STRING,
                           szFormat, 0, 0,
                           szBuffer, nSize,
                           &marker) ;

    va_end (marker) ;                       // Reset variable arguments

    return dwRet ;
}


//
//  void AboutDlg_OnCommand (HWND hwnd, int id, hwnd hwndCtl, UINT codeNotify)
//
//  hwnd            Window handle for the dialog box window
//  id              Specifies the identifier of the menu item, control, or accelerator.
//  hwndCtl         Handle of the control sending the message if the message
//                  is from a control, otherwise, this parameter is NULL. 
//  codeNotify      Specifies the notification code if the message is from a control.
//                  This parameter is 1 when the message is from an accelerator.
//                  This parameter is 0 when the message is from a menu.
//                  
//
//  PURPOSE:        
//                  Handle the keyboard and control notifications.
//                  An OK button press, or Enter/Esc keypress
//                  all dismiss the About dialog box.
//                  
//
//  COMMENTS:
//

static
void AboutDlg_OnCommand (HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
    switch (id) {
        case IDOK:                          // OK pushbutton/Enter keypress
        case IDCANCEL:                      // Esc keypress
            EndDialog (hwnd, TRUE) ;        // Dismiss the about dialog box
			break ;

		default:
			break ;
	}
}

//
//  NTTYPE GetNTVersion ()
//
//  PURPOSE:        
//                  Determine the specific variant of Windows NT on which
//					we're running.
//
//  COMMENTS:
//					Windows NT 4.0 does not follow the documentation
//					in the knowledgebase. Specifically, both versions set the
//                  appropriate registry key to "LANMANNT" rather than "SERVERNT".
//

static NTTYPE
GetNTVersion ()
{
    TCHAR               szValue [256] ;
    DWORD               dwType = 0, dwSize = sizeof (szValue) ;
    HKEY                hKey       = NULL ;
    LONG                lStatus ;

static const TCHAR szProductOptions []   = TEXT("SYSTEM\\CurrentControlSet\\Control\\ProductOptions") ;
static const TCHAR szProductType []      = TEXT("ProductType") ;
static const TCHAR szWinNT []            = TEXT("WINNT") ;      //  Windows NT Workstation is running
static const TCHAR szServerNT []         = TEXT("SERVERNT") ;   //  Windows NT Server (3.5 or later) is running
static const TCHAR szAdvancedServerNT [] = TEXT("LANMANNT") ;   //  Windows NT Advanced Server (3.1) is running

    lStatus = ::RegOpenKeyEx (HKEY_LOCAL_MACHINE,szProductOptions, 0, KEY_QUERY_VALUE, &hKey) ;
    if (ERROR_SUCCESS != lStatus)
        return typeDefault ;            // Windows NT

    lStatus = ::RegQueryValueEx (hKey, szProductType, NULL, &dwType, (LPBYTE) szValue, &dwSize) ; 
    ::RegCloseKey (hKey) ;
    if (ERROR_SUCCESS != lStatus)
        return typeDefault ;            // Windows NT

    if (0 == lstrcmpi (szWinNT, szValue))
        return typeWorkstation ;        // Windows NT Workstation
    else if (0 == lstrcmpi (szServerNT, szValue))
        return typeServer ;             // Windows NT Server
    else if (0 == lstrcmpi (szAdvancedServerNT, szValue))
        return typeServer ;             // Windows NT Advanced Server (3.1)

    return typeDefault ;                // Windows NT
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?