你好我正在嘗試使用32位和64位編譯代碼讀寫註冊表值。每個編譯應該讀/寫相同的位置。 我曾嘗試使用KEY_WOW64_32KEY無濟於事。KEY_WOW64_32KEY在32位和64位編譯之間給出不同的結果
當我用32位目標編譯下面的代碼時,它會寫入並讀取值。 當我用64位目標進行編譯時,它無法找到或寫入密鑰。
編輯:以下代碼可以在Windows XP 64位上使用32位和64位版本正常工作。 Windows 7 64位出現問題。
任何幫助表示讚賞, Rob。
#include <windows.h>
#include <stdio.h>
#define ISVALIDHANDLE(x) (x != NULL && x != INVALID_HANDLE_VALUE)
#define KEY_ACCESS_DEF (KEY_ALL_ACCESS | KEY_READ | KEY_WRITE | KEY_WOW64_32KEY)
#define KEYPATH "SOFTWARE\\X\\Y"
#define KEYNAME "Z"
static bool
doInstallKey(HKEY key, const char *keypath, const char *keyname, const char *keyvalue)
{
HKEY rootKey, myKey;
bool r = false;
RegOpenKeyEx(key, NULL, 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &rootKey);
if(ISVALIDHANDLE(rootKey))
{
HRESULT res;
unsigned long createType;
res = RegCreateKeyEx(rootKey, keypath, 0, NULL,
REG_OPTION_NON_VOLATILE,
KEY_ACCESS_DEF, NULL, &myKey, &createType);
if(ISVALIDHANDLE(myKey))
{
RegSetValueEx(myKey, keyname, 0,
REG_SZ, (unsigned char *)keyvalue, strlen(keyvalue)+1);
RegCloseKey(myKey);
r = true;
}
else
{
// If we cant create it, maybe it already exits,
// just change the value.
res = RegOpenKeyEx(rootKey, keypath, 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &myKey);
if(ISVALIDHANDLE(myKey))
{
RegSetValueEx(myKey, keyname, 0,
REG_SZ, (unsigned char *)keyvalue, strlen(keyvalue)+1);
RegCloseKey(myKey);
r = true;
}
else
{
// error
}
}
RegCloseKey(rootKey);
}
return r;
}
static int
doGetInstallKey(HKEY key, const char *keypath, const char *keyname,
char *keyvalue, unsigned long keylen)
{
HKEY rootKey, myKey;
int valid = 0;
keyvalue[0] = 0;
RegOpenKeyEx(key, NULL, 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &rootKey);
if(ISVALIDHANDLE(rootKey))
{
RegOpenKeyEx(key, keypath, 0, KEY_QUERY_VALUE | KEY_WOW64_32KEY, &myKey);
if(ISVALIDHANDLE(myKey))
{
unsigned long type = 0;
HRESULT res;
res = RegQueryValueEx(myKey, keyname, NULL,
&type, (unsigned char *)keyvalue, &keylen);
if (res == ERROR_SUCCESS)
valid = keylen;
RegCloseKey(myKey);
}
RegCloseKey(rootKey);
}
return valid;
}
int
main(int argc, char *argv[])
{
char buf[1024];
int len = 1023;
// read key
doGetInstallKey(HKEY_LOCAL_MACHINE, KEYPATH, KEYNAME, buf, len);
fprintf(stdout, "BEFORE: %s\n", buf);
// write key
doInstallKey(HKEY_LOCAL_MACHINE, KEYPATH, KEYNAME, "def64");
// read key
doGetInstallKey(HKEY_LOCAL_MACHINE, KEYPATH, KEYNAME, buf, len);
fprintf(stdout, "AFTER: %s\n", buf);
return 0;
}
你忘了使用RegCreateKeyEx –
選項 'KEY_ACCESS_DEF' 保存選項。 (我知道這個名字有點誤導)。 然而,即使沒有創建它,閱讀仍然無法找到什麼32位應用程序以前寫。 – rbairos