2009-11-28 13 views

Odpowiedz

8

Mam bardzo stary kod, ale powinno dać dobry pomysł:

/** 
* @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

awesomeness, wielkie dzięki – Maciek

+0

jaki jest ciąg poz skomponowane na drodze? – Maciek

+7

Ten kod jest potencjalnie niebezpieczny. Dokumentacja RegQueryValueEx (http://msdn.microsoft.com/en-us/library/ms724911(VS.85).aspx) mówi (w dziale Uwagi), że pobrany łańcuch może nie być zakończony znakiem null. Co więcej, jeśli jest to ciąg "wielu ciągów znaków", będzie miał podwójne zakończenie zerujące, które również będzie niewłaściwie zarządzane przez ten kod. –

Powiązane problemy