次のコード例は、64ビットWindowsのレジストリリダイレクタによって提供されるレジストリの個別のビューを示しています。また、キーが共有されているかリダイレクトされているかに応じて、キーの値がどのように設定されるかを示します。詳細については、「WOW64の影響を受けるレジストリキー」を参照してください。
32ビットと64ビットの両方のWindows用に、次のコードを個別にコンパイルします。結果の各実行可能ファイルを64ビットWindowsで実行し、出力を比較します。両方のバージョンのサンプル出力は、ソースコードの下にリストされています。
#include <windows.h> #include <stdio.h> #pragma comment(lib, "advapi32.lib") // Define application constants. #if defined(_WIN64) #define VIEW_DATA L"Hello! 64-bit World" #define ALT_VIEW_DATA L"Hello! 32-bit World" #define CROSS_ACCESS KEY_WOW64_32KEY #else #define VIEW_DATA L"Hello! 32-bit World" #define ALT_VIEW_DATA L"Hello! 64-bit World" #define CROSS_ACCESS KEY_WOW64_64KEY #endif // Create a registry key and set its value. // Return TRUE if the function succeeds, FALSE if it fails. BOOL CreateRegistryKeyValue( HKEY hKeyParent, PWCHAR KeyName, REGSAM rsAccessMask, REGSAM rsSamViewFlag, PBYTE pValue, DWORD dwValueSize ) { DWORD dwDisposition; HKEY hKey; DWORD dwRet; dwRet = RegCreateKeyEx( hKeyParent, KeyName, 0, NULL, REG_OPTION_NON_VOLATILE, rsAccessMask | rsSamViewFlag, NULL, &hKey, &dwDisposition); if (dwRet != ERROR_SUCCESS) { printf("Error opening or creating key.\n"); return FALSE; } // Attempt to set the value of the key. // If the call fails, close the key and return. if (ERROR_SUCCESS != RegSetValueEx( hKey, NULL, 0, REG_SZ, pValue, dwValueSize)) { printf("Could not set registry value.\n"); RegCloseKey(hKey); return FALSE; } RegCloseKey(hKey); return TRUE; } // Access a registry key and print its value. // Return TRUE if the function succeeds, FALSE if it fails. BOOL AccessRegistryKeyValue( HKEY hKeyParent, PWCHAR KeyName, REGSAM rsAccessMask, REGSAM rsSamViewFlag ) { HKEY hKey; WCHAR Buffer[MAX_PATH]; DWORD dwSize = sizeof(Buffer); DWORD dwType; DWORD dwRet; dwRet = RegOpenKeyEx( hKeyParent, KeyName, 0, rsAccessMask | rsSamViewFlag, &hKey); if (dwRet != ERROR_SUCCESS) { printf("Error opening key!\n"); return FALSE; } if (ERROR_SUCCESS != RegQueryValueEx( hKey, NULL, 0, &dwType, (PBYTE)Buffer, &dwSize)) { printf("Could not read registry value.\n"); RegCloseKey(hKey); return FALSE; } if (rsSamViewFlag != 0) { printf("Alternate view: %S\n", Buffer); } else { printf("Default view: %S\n", Buffer); } RegCloseKey(hKey); return TRUE; } int main() { BOOL Res; // Define the list of keys to work with. typedef struct { HKEY hkRoot; LPWSTR szRootName; LPWSTR szName; }KEYDATA; KEYDATA Keys[] = { { HKEY_LOCAL_MACHINE, L"HKLM", L"Software\\Hello World" }, { HKEY_CLASSES_ROOT, L"HKCR", L"Hello" }, { HKEY_CLASSES_ROOT, L"HKCR", L"CLSID\\{00000000-0000-0000-0000-ABCD00000000}" }, { HKEY_CLASSES_ROOT, L"HKCR", L"CLSID\\{00000000-0000-0000-0000-ABCD00000000}\\InprocServer32" }, { HKEY_CLASSES_ROOT, L"HKCR", L"CLSID\\{00000000-0000-0000-0000-ABCD00000000}\\LocalServer32" } }; // Now create the keys. for (int i = 0; i < _countof(Keys); i++) { // Create the keys in the alternate view of the registry. Res = CreateRegistryKeyValue( Keys[i].hkRoot, Keys[i].szName, KEY_READ | KEY_WRITE, CROSS_ACCESS, (PBYTE)ALT_VIEW_DATA, sizeof(ALT_VIEW_DATA)); if (Res == FALSE) { printf("Could not create keys in alternate view of the registry.\n"); return 1; } // Create the keys in the default view of the registry. Res = CreateRegistryKeyValue( Keys[i].hkRoot, Keys[i].szName, KEY_READ | KEY_WRITE, 0, (PBYTE)VIEW_DATA, sizeof(VIEW_DATA)); if (Res == FALSE) { printf("Could not create keys in default view of the registry.\n"); return 1; } } // Access the registry and print key values. printf("Application string: %S\n", VIEW_DATA); for (int i = 0; i < _countof(Keys); i++) { printf("%S\\%S\n", Keys[i].szRootName, Keys[i].szName); Res = AccessRegistryKeyValue( Keys[i].hkRoot, Keys[i].szName, KEY_READ, 0); if (Res == FALSE) { printf("Unable to access default view of registry.\n"); return 1; } // Calls with CROSS_ACCESS explicitly access the alternate registry view. Res = AccessRegistryKeyValue( Keys[i].hkRoot, Keys[i].szName, KEY_READ, CROSS_ACCESS); if (Res == FALSE) { printf("Unable to access alternate view of registry.\n"); return 1; } } return 0; }
64ビットバージョンの例を実行すると、次の出力が生成されます。このキーが共有されているため、HKCR \ Helloのデフォルトビューと代替ビューの値は同じです。他のキーの値はリダイレクトされるため、異なります。
Windows Server 2008、Windows Vista、Windows Server 2003、およびWindows XP:これらのオペレーティングシステムでこの例を実行すると、LocalServer32キーのデフォルトビューと代替ビューは同じ値になります。これは、LocalServer32キーがリダイレクトされて反映されるため、キーへのハンドルが閉じられるとすぐに、レジストリの64ビットビューと32ビットビューの間でその値が同期されます。 Windows 7以降、レジストリリフレクションは削除されました。詳細については、「レジストリリフレクション」を参照してください。
Application string: Hello! 64-bit World HKLM\Software\Hello World Default view: Hello! 64-bit World Alternate view: Hello! 32-bit World HKCR\Hello Default view: Hello! 64-bit World Alternate view: Hello! 64-bit World HKCR\CLSID\{00000000-0000-0000-0000-ABCD00000000} Default view: Hello! 64-bit World Alternate view: Hello! 32-bit World HKCR\CLSID\{00000000-0000-0000-0000-ABCD00000000}\InprocServer32 Default view: Hello! 64-bit World Alternate view: Hello! 32-bit World HKCR\CLSID\{00000000-0000-0000-0000-ABCD00000000}\LocalServer32 Default view: Hello! 64-bit World Alternate view: Hello! 32-bit World
サンプルの32ビットバージョンを実行すると、次の出力が生成されます。 32ビットアプリケーションの場合、レジストリの64ビットビューが代替ビューになるため、共有キーであるHKCR \ Helloを除いて、値が逆になります。
Application string: Hello! 32-bit World HKLM\Software\Hello World Default view: Hello! 32-bit World Alternate view: Hello! 64-bit World HKCR\Hello Default view: Hello! 32-bit World Alternate view: Hello! 32-bit World HKCR\CLSID\{00000000-0000-0000-0000-ABCD00000000} Default view: Hello! 32-bit World Alternate view: Hello! 64-bit World HKCR\CLSID\{00000000-0000-0000-0000-ABCD00000000}\InprocServer32 Default view: Hello! 32-bit World Alternate view: Hello! 64-bit World HKCR\CLSID\{00000000-0000-0000-0000-ABCD00000000}\LocalServer32 Default view: Hello! 32-bit World Alternate view: Hello! 64-bit World
この例をregeditで実行した場合の影響を調べるには、次のキーの値を調べます。アプリケーションでは、ハードコードされたレジストリパスでWow6432Nodeを使用しないようにする必要があります。
** HKLM \\ SOFTWARE \\ Hello World ** ** HKLM \\ SOFTWARE \\ Wow6432Node \\ Hello World ** ** HKCR \\ CLSID \\ {00000000-0000-0000-0000-ABCD00000000} ** ** HKCR \\ CLSID \\ {00000000-0000-0000-0000-ABCD00000000} \\ InprocServer32 ** ** HKCR \\ CLSID \\ {00000000-0000-0000-0000-ABCD00000000} \\ LocalServer32 ** ** HKCR \ \ Hello HKCR \\ Wow6432Node \\ CLSID \\ {00000000-0000-0000-0000-ABCD00000000} ** ** HKCR \\ Wow6432Node \\ CLSID \\ {00000000-0000-0000-0000-ABCD00000000} \\ InprocServer32 * * ** HKCR \\ Wow6432Node \\ CLSID \\ {00000000-0000-0000-0000-ABCD00000000} \\ LocalServer32 ** ** HKCR \\ Wow6432Node \\ Hello **
関連トピック