代码之家  ›  专栏  ›  技术社区  ›  Chris

RegQueryValueExW只从注册表中带回一个值

  •  2
  • Chris  · 技术社区  · 16 年前

    我正在Windows CE上查询注册表。我想从注册表的TcpIp区域中提取DhcpDNS值,这是可行的。

    但是,如果有两个值-显示为 "x.x.x.x" "x.x.x.x" 在我的CE注册表编辑器-然后它只带回其中一个。我确信这是一个愚蠢的错误,但我不确定为什么会发生。

    这是我正在使用的代码

    std::string ISAPIConfig::GetTcpIpRegSetting(const std::wstring &regEntryName)
    {
        HKEY hKey = 0;
        HKEY root = HKEY_LOCAL_MACHINE;
        LONG retVal = 0;
    
        wchar_t buffer[3000];
        DWORD bufferSize = 0;
        DWORD dataType = 0;
    
        std::string dataString = "";
    
        //Open IP regkey
        retVal = RegOpenKeyExW(root, L"Comm\\PCI\\FETCE6B1\\Parms\\TcpIp", 0, 0, &hKey);
    
        //Pull out info we need
        memset(buffer, 0, sizeof(buffer));
        bufferSize = sizeof(buffer);
        retVal = RegQueryValueExW(hKey, regEntryName.c_str(), 0, &dataType, reinterpret_cast<LPBYTE>(buffer), &bufferSize);
        Unicode::UnicodeToAnsi(buffer, dataString);
    
        return dataString;
    }
    
    void UnicodeToAnsi(const std::wstring &wideString, std::string &ansiString){
        std::wostringstream converter;
        std::ostringstream converted;
        std::wstring::const_iterator loop;
    
        for(loop = wideString.begin(); loop != wideString.end(); ++loop){
            converted << converter.narrow((*loop));
        }
    
        ansiString = converted.str();
    }
    
    1 回复  |  直到 16 年前
        1
  •  1
  •   ctacke    16 年前

    multi_sz ,格式为:

    {data}\0{data}\0\0

    我不知道Unicode::UnicodeToAnsi是做什么的,但它很可能只是在寻找第一个空终止符,然后停在那里。必须解析过去的单空值,直到到达双空值。

    你必须更新你的代码-很可能是你的接口。现在您正尝试为multi_sz返回一个字符串,根据定义,它意味着多个字符串。您可能希望返回一个字符串[](尽管我可能会选择使用两个输出参数—一个是数组指针,另一个是元素计数)。

    TCHAR *p = buffer;
    
    if(bufferSize > 0)
    {
      do
      {
          Unicode::UnicodeToAnsi(p, dataString); 
          // do something with dataString - store it in an array or whatever
          p+= _tcslen(p);
        }   while((p-buffer) < bufferSize)
    }
    
    推荐文章