2009-11-28 16 views

risposta

8

ho qualche molto vecchio codice, ma dovrebbe darvi una buona idea:

/** 
* @param location The location of the registry key. For example "Software\\Bethesda Softworks\\Morrowind" 
* @param name the name of the registry key, for example "Installed Path" 
* @return the value of the key or an empty string if an error occured. 
*/ 
std::string getRegKey(const std::string& location, const std::string& name){ 
    HKEY key; 
    TCHAR value[1024]; 
    DWORD bufLen = 1024*sizeof(TCHAR); 
    long ret; 
    ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE, location.c_str(), 0, KEY_QUERY_VALUE, &key); 
    if(ret != ERROR_SUCCESS){ 
     return std::string(); 
    } 
    ret = RegQueryValueExA(key, name.c_str(), 0, 0, (LPBYTE) value, &bufLen); 
    RegCloseKey(key); 
    if ((ret != ERROR_SUCCESS) || (bufLen > 1024*sizeof(TCHAR))){ 
     return std::string(); 
    } 
    std::string stringValue = std::string(value, (size_t)bufLen - 1); 
    size_t i = stringValue.length(); 
    while(i > 0 && stringValue[i-1] == '\0'){ 
     --i; 
    } 
    return stringValue.substr(0,i); 
} 
+0

suggestione, grazie mille – Maciek

+0

come è la stringa pos composto a proposito? – Maciek

+7

Questo codice è potenzialmente pericoloso. La documentazione di RegQueryValueEx (http://msdn.microsoft.com/en-us/library/ms724911(VS.85).aspx) dice (nella sezione Commenti) che la stringa recuperata potrebbe non essere terminata con null. Inoltre, se si tratta di una "stringa multipla", avrà un doppio terminatore null che verrà mal gestito anche da questo codice. –

Problemi correlati