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
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
相关文章推荐
- win7 64位注册表操作兼容问题解决(vc6)
- win7 64位注册表操作兼容问题解决
- 解决Win7 64位玩游戏不兼容的问题
- 关于wtk不兼容64位Win7的问题解决
- vc++兼容不了win7的解决办法+c语言输入字符串的一些问题
- win7 64位系统 Oracle32bit + PL/SQL访问Orale服务,Oracle 11g的安装,中文乱码问题的解决
- VMware Workstation7.1解决win7软件兼容问题
- 64位WIN7安装SourceInsight3.5汉化补丁或绿色汉化版显示序列号无效的问题与解决办法
- APM 64位无法安装驱动问题解决(for 精简版GHOST系统及64位win7)
- win7软件兼容问题解决办法
- 解决Win7 64位共享打印机安装问题
- win7 64位装32位caa遇到问题解决方案
- VTK亲自安装出现的问题及解决办法(WIN7 64位 + VS2012 + VTK-5.10.1)
- Win7解决多核处理器兼容问题提高计算能力
- 【热门技术】解决Win7 下面很多软件安装不兼容的问题
- linux 64位系统兼容32bit程序 ioctl调用cmd匹配问题解决
- win7 64位系统使用VS2010生成时出现中文目录乱码问题的解决方法
- Win7 64位编译Python扩展解决”error: Unable to find vcvarsall.bat”问题
- 解决华硕笔记本(ASUS)不能重新安装WIN7操作的问题
- 解决win7 64位操作系统下安装PL/SQL后连接报错问题: make sure you have the 32 bits oracle client installed