2 Stimmen

RegQueryValueExW gibt nur einen Wert aus der Registrierung zurück

Ich frage die Registry unter Windows CE ab. Ich möchte den DhcpDNS-Wert aus dem TcpIp-Bereich der Registrierung abrufen, was auch funktioniert.

Was jedoch passiert, ist, wenn es zwei Werte gibt - angezeigt als "x.x.x.x" "x.x.x.x" in meinem CE-Registrierungseditor - dann wird nur einer von ihnen angezeigt. Ich bin sicher, dass dies ein dummer Fehler ist, aber ich bin unsicher, warum es passiert.

Hier ist der Code, den ich verwende

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();
}

1voto

ctacke Punkte 65813

Der Wert ist ein mehrfach_sz die das Format hat:

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

Ich weiß nicht, was Unicode::UnicodeToAnsi macht, aber wahrscheinlich sucht es nur nach dem ersten Nullterminator und hält dort an. Sie müssen über einzelne Nullen hinweg parsen, bis Sie auf die Doppelnull treffen.

EDITAR

Sie müssen Ihren Code aktualisieren - sehr wahrscheinlich Ihre Schnittstellen. Im Moment versuchen Sie, eine Zeichenfolge für eine multi_sz zurückgibt, die per Definition, mehrere Zeichenfolgen bedeutet. Sie wollen wahrscheinlich einen String[] zurückgibt (obwohl ich wahrscheinlich entscheiden, ein paar Ausgabeparameter zu verwenden - eine, die ein Array-Zeiger und die andere, die eine Elementanzahl ist).

Sie müssen dann in einer Schleife durch die Daten, die von der RegQuery-Aufruf zurückkam, etwas vielleicht wie diese (von der Spitze von meinem Kopf, nicht getestet oder kompiliert):

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X