您的位置:首页 > 其它

win7 64位注册表操作兼容问题解决(vc6)

2013-02-24 11:06 387 查看
为了完成一个简单的远程监控程序,由于我本身是win7 64位的OS,我的思路是将监听端口保存在注册表中,编写服务端的时候将手动创建了一个键值为RemoteProcessManager的子项,里面子健port为REG_DWORD类型。通过下面代码读取:

DWORD GetListenPort()

{

HKEY hkey;

long lRet=0;

DWORD dwPort=0;

// 打开注册表键

lRet=RegOpenKeyEx(

HKEY_LOCAL_MACHINE, // 要打开的主键

szSubKey, // 打开的子健

NULL, // 特殊属性

KEY_ALL_ACCESS, // 所有访问权限

&hkey // 返回操作句柄

);

if (ERROR_SUCCESS!=lRet)

{

TRACE("Open RegKey Failed!");

return 0;

}

DWORD dwSize = sizeof(DWORD);

DWORD dType;

// 查询键值

lRet=RegQueryValueEx(hkey,"Port",NULL,&dType,(BYTE*)(&dwPort),&dwSize);

printf("Port:%x\n",dwPort);

if (ERROR_SUCCESS!=lRet)

{

TRACE("Query Key Value Failed!\n");

RegCloseKey(hkey);

return 0;

}

RegCloseKey(hkey);

return dwPort;

}

发现键值存在,在调用RegQueryValueEx的时候总是查询失败,返回了0,一直以为是权限的问题,将其提升到debug还是不行,网络上也有朋
友说创建.mainfest的文件提升权限,后面在MSDN网上也找到相关说明。不过还是失败。把这个程序放到xp下和win7
32下均能正常得到读取出来的值.于是就想会不会是64位OS的问题呢?最后还是在微软最新MSDN在线找到了答案。原来是在64位OS下操作注册表必须
注意设置一个值。首先在文件头定义:

#define KEY_WOW64_64KEY 256 // 兼容64位主机

然后将RegOpenKeyEx的参数加上

KEY_ALL_ACCESS|KEY_WOW64_64KEY, // 所有访问权限

至此问题解决了,机器上的MSDN是2001年的,看来太老了。多看看官方的MSDN文档吧。另外提供分享一个判断机器是64为还是32位的的函数:

// 返回值:TRUE说明是64位否则为32位OS

typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);

LPFN_ISWOW64PROCESS fnIsWow64Process;

BOOL IsWow64()

{

BOOL bIsWow64 = FALSE;

fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(

GetModuleHandle(TEXT("kernel32")),"IsWow64Process");

if (NULL != fnIsWow64Process)

{

if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))

{

// handle error

AfxMessageBox("IsWow64 error!");

}

}

return bIsWow64;

}

参考文档:

[1]http://msdn.microsoft.com/en-us/library/aa384129%28v=VS.85%29.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: