Eric's Blog

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

为了完成一个简单的远程监控程序,由于我本身是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

posted on 2013-02-24 11:06  ericsure  阅读(800)  评论(0编辑  收藏  举报