0

MBCS 用にコンパイルする次のコードがあります。

CString GetRegistry(LPCTSTR pszValueName)
{
    // Try open registry key
    HKEY hKey = NULL;
    LPCTSTR pszSubkey = _T("SOFTWARE\\Wow6432Node\\PAX");
    if ( RegOpenKey(HKEY_LOCAL_MACHINE, pszSubkey, &hKey) != ERROR_SUCCESS )
    {
        // Error:
        // throw an exception or something...
        //
        // (In production code a custom C++ exception 
        // derived from std::runtime_error could be used)
        AtlThrowLastWin32();
    }

    // Buffer to store string read from registry
    TCHAR szValue[1024];
    DWORD cbValueLength = sizeof(szValue);

    // Query string value
    if ( RegQueryValueEx(
            hKey,
            pszValueName, 
            NULL, 
            NULL, 
            reinterpret_cast<LPBYTE>(&szValue), 
            &cbValueLength) 
         != ERROR_SUCCESS )
    {
        // Error
        // throw an exception or something...
        AtlThrowLastWin32();
    }

    // Create a CString from the value buffer
    return CString(szValue);
}
  • コードを 32 ビット コンピュータでも動作させるにはどうすればよいですか?
  • 戻り値を単純な文字列に入れるにはどうすればよいですか? 元; 文字列 namevalue = GetRegistry(_T("名前"));
4

1 に答える 1

0

フラグを使用RegOpenKeyEx()して、ノードを処理させる必要があります。たとえば、次のようになります。KEY_WOW64_32KEYWow6432

CString GetRegistry(LPCTSTR pszValueName)
{
    // WOW64 access
    REGSAM Wow64Flag;
    #ifdef _WIN64
    Wow64Flag = KEY_WOW64_32KEY;
    #else
    Wow64Flag = 0;
    #endif

    // Try open registry key
    HKEY hKey = NULL;

    LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\PAX"), 0, KEY_QUERY_VALUE | Wow64Flag, &hKey);
    if ( lResult != ERROR_SUCCESS )
    {
        // Error:
        // throw an exception or something...
        //
        // (In production code a custom C++ exception 
        // derived from std::runtime_error could be used)
        SetLastError(lResult);
        AtlThrowLastWin32();
    }

    DWORD cbValueLength;

    // Query string value size
    lResult = RegQueryValueEx(
            hKey,
            pszValueName, 
            NULL, 
            NULL, 
            NULL, 
            &cbValueLength) 
         != ERROR_SUCCESS )
    {
        // Error
        RegCloseKey(hKey);
        // throw an exception or something...
        SetLastError(lResult);
        AtlThrowLastWin32();
    }

    // Buffer to return string read from registry
    CString sValue;

    if ( cbValueLength > 0 )
    {
        // Buffer to store string read from registry
        std::vector<TCHAR> szValue((cbValueLength / sizeof(TCHAR))+1);

        lResult = RegQueryValueEx(
                hKey,
                pszValueName, 
                NULL, 
                NULL, 
                reinterpret_cast<LPBYTE>(&szValue[0]), 
                &cbValueLength) 
             != ERROR_SUCCESS )
        {
            // Error
            RegCloseKey(hKey);
            // throw an exception or something...
            SetLastError(lResult);
            AtlThrowLastWin32();
        }

        szValue[cbValueLength / sizeof(TCHAR)] = 0;
        sValue = &szValue[0];
    }

    RegCloseKey(hKey);

    return sValue;
}

64 ビット プロセスで が指定されている場合KEY_WOW64_32KEY、または 32 ビット プロセスで WOW64 フラグが指定されていない場合、プロセスは 32 ビット レジストリにアクセスするため、64 ビット システムでSOFTWARE\PAXは に解決されます。SOFTWARE\Wow6432Node\PAX

于 2014-04-16T01:33:49.667 に答える