RegQueryValueExW возвращает только одно значение из реестра - PullRequest
2 голосов
/ 23 июля 2010

Я запрашиваю реестр в Windows CE. Я хочу получить значение DhcpDNS из области TcpIp реестра, которая работает.

Однако, что происходит, если есть два значения - отображаются как "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 Ответ

1 голос
/ 23 июля 2010

Значение: multi_sz в формате:

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

Я не знаю, что делает Unicode :: UnicodeToAnsi, носкорее всего, он просто ищет тот первый нулевой терминатор и останавливается там.Вы должны анализировать последние единичные нули, пока не достигнете двойного нуля.

РЕДАКТИРОВАТЬ

Вы должны обновить свой код - скорее всего, ваши интерфейсы.Прямо сейчас вы пытаетесь вернуть строку для multi_sz, которая по определению означает несколько строк.вы, вероятно, захотите вернуть строку [] (хотя я, вероятно, предпочту использовать пару выходных параметров - один - это указатель массива, а другой - количество элементов).

Затем необходимо выполнить циклданные, которые были возвращены из вызова RegQuery, что-то вроде этого (вне моей головы, не проверено или скомпилировано):

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)
}
...