2009-11-28 4 views

Antwort

8

Ich habe einige sehr alte Code, aber es sollte Ihnen eine gute Idee geben:

/** 
* @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, vielen Dank – Maciek

+0

wie die pos Zeichenfolge durch die Art und Weise zusammengesetzt? – Maciek

+7

Dieser Code ist möglicherweise unsicher. Die RegQueryValueEx-Dokumentation (http://msdn.microsoft.com/en-us/library/ms724911(VS.85).aspx) sagt (im Abschnitt "Hinweise"), dass die abgerufene Zeichenfolge möglicherweise nicht null terminiert ist. Darüber hinaus wird es, wenn es sich um eine "Multi-Zeichenfolge" handelt, einen Doppel-Null-Terminator haben, der ebenfalls von diesem Code falsch behandelt wird. –

Verwandte Themen