C++ KEY_WOW64_32在32位和64位编译之间提供不同结果的KEY

C++ KEY_WOW64_32在32位和64位编译之间提供不同结果的KEY,c++,registry,64-bit,wow64,C++,Registry,64 Bit,Wow64,您好,我正在尝试使用32位和64位编译代码向注册表读写一个值。每个编译都应该读/写到相同的位置。 我尝试过使用密钥\u WOW64\u 32密钥,但无效 当我使用32位目标编译以下代码时,它会写入和读取值。 当我使用64位目标编译时,它既找不到键,也写不出键 编辑:以下代码适用于Windows XP 64位上的32位和64位版本。 问题出现在64位Windows 7上 感谢您的帮助, 罗布 #包括 #包括 #定义ISVALIDHANDLE(x)(x!=NULL&&x!=INVALID\u HAN

您好,我正在尝试使用32位和64位编译代码向注册表读写一个值。每个编译都应该读/写到相同的位置。 我尝试过使用密钥\u WOW64\u 32密钥,但无效

当我使用32位目标编译以下代码时,它会写入和读取值。 当我使用64位目标编译时,它既找不到键,也写不出键

编辑:以下代码适用于Windows XP 64位上的32位和64位版本。 问题出现在64位Windows 7上

感谢您的帮助, 罗布

#包括
#包括
#定义ISVALIDHANDLE(x)(x!=NULL&&x!=INVALID\u HANDLE\u值)
#定义密钥访问定义(密钥访问所有密钥读取密钥写入密钥WOW64密钥)
#定义密钥路径“软件\\X\\Y”
#定义键名“Z”
静态布尔
doInstallKey(HKEY键、常量字符*键路径、常量字符*键名、常量字符*键值)
{
HKEY rootKey,myKey;
布尔r=假;
RegOpenKeyEx(key,NULL,0,key_QUERY_VALUE | key_WOW64_32KEY,&rootKey);
if(ISVALIDHANDLE(rootKey))
{
HRESULT res;
无符号长createType;
res=RegCreateKeyEx(rootKey,keypath,0,NULL,
REG\u选项\u非易失性,
KEY_ACCESS_DEF,NULL,&myKey,&createType);
if(ISVALIDHANDLE(myKey))
{
RegSetValueEx(myKey,keyname,0,
REG_SZ,(无符号字符*)键值,strlen(键值)+1;
RegCloseKey(myKey);
r=真;
}
其他的
{
//如果我们不能创建它,也许它已经存在了,
//只需更改值。
res=RegOpenKeyEx(rootKey,keypath,0,KEY_QUERY_VALUE | KEY_WOW64_32KEY,&myKey);
if(ISVALIDHANDLE(myKey))
{
RegSetValueEx(myKey,keyname,0,
REG_SZ,(无符号字符*)键值,strlen(键值)+1;
RegCloseKey(myKey);
r=真;
}
其他的
{
//错误
}
}
RegCloseKey(rootKey);
}
返回r;
}
静态整数
doGetInstallKey(HKEY键、常量字符*键路径、常量字符*键名、,
char*keyvalue,无符号长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))
{
无符号长类型=0;
HRESULT res;
res=RegQueryValueEx(myKey,keyname,NULL,
&类型,(无符号字符*)keyvalue和&keylen);
如果(res==错误\u成功)
有效=keylen;
RegCloseKey(myKey);
}
RegCloseKey(rootKey);
}
返回有效;
}
int
main(int argc,char*argv[])
{
char-buf[1024];
int len=1023;
//读键
doGetInstallKey(HKEY_本地_机器、密钥路径、密钥名、buf、len);
fprintf(标准输出,“之前:%s\n”,buf);
//写密钥
doInstallKey(HKEY_LOCAL_机器,密钥路径,密钥名,“def64”);
//读键
doGetInstallKey(HKEY_本地_机器、密钥路径、密钥名、buf、len);
fprintf(标准输出,在:%s\n之后,buf);
返回0;
}

在Windows 7上测试时,您是否以管理员身份运行?您可能会遇到

尝试替换

#define KEY_ACCESS_DEF        (KEY_ALL_ACCESS | KEY_READ | KEY_WRITE | KEY_WOW64_32KEY)
为了


您忘记使用RegCreateKeyEx中的选项,“KEY_ACCESS_DEF”保留该选项。(我知道这个名字有点误导人)。然而,即使没有创建它,reading仍然无法找到32位应用之前写的东西。谢谢,就是这样!太糟糕了,我不能通过编程在64中关闭它,但我找到了一个解决办法。谢谢
#define KEY_ACCESS_DEF        (KEY_ALL_ACCESS | KEY_READ | KEY_WRITE | KEY_WOW64_32KEY)
#define KEY_ACCESS_DEF        (KEY_READ | KEY_WRITE | KEY_WOW64_32KEY)