2010-07-23 7 views
2

J'interroge le registre sur Windows CE. Je veux retirer la valeur DhcpDNS de la zone TcpIp du registre, qui fonctionne. Cependant, ce qui se passe, cependant, c'est s'il y a deux valeurs - affichées comme "x.x.x.x" "x.x.x.x" dans mon éditeur de registre CE - alors cela ne fait que ramener l'une d'entre elles. Je suis sûr que c'est une erreur stupide mais je ne sais pas pourquoi cela se passe.RegQueryValueExW ne récupère qu'une seule valeur du registre

Voici le code que je utilise

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

Répondre

1

La valeur est une multi_sz, qui est au format:

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

Je ne sais pas ce que l'Unicode :: UnicodeVersAnsi fait, mais il est probablement juste à la recherche de ce premier terminateur null et s'arrêtant là. Vous devez analyser les simples valeurs nulles jusqu'à ce que vous ayez atteint le double zéro.

EDIT

Vous devez mettre à jour votre code - très probablement vos interfaces. En ce moment, vous essayez de renvoyer une chaîne pour un multi_sz qui, par définition, signifie plusieurs chaînes. vous voulez probablement retourner une chaîne [] (bien que j'aurais probablement choisi d'utiliser quelques paramètres de sortie - un qui est un pointeur de tableau et l'autre qui est un nombre d'éléments).

Vous devez ensuite une boucle à travers les données qui est revenue de l'appel RegQuery, quelque chose peut-être comme celui-ci (du haut de ma tête, n'a pas été testé ou compilé):

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

Mise à jour avec code 'UnicodeToAnsi' - Comment puis-je modifier cela pour travailler avec multi_sz? – Chris