Nyt on niin, että olen joskus pystynyt ohjelmassani lukemaan ja kirjoittamaan kätevästi windowsin rekisteriä. Lukemiseen löysin jo koodirimpsun googlesta, mutta kirjoittamiseen ei löytynyt hyvää ohjetta, kun kieli on C++ ja ohjelma, jota käytän on Dev-Cpp.
Haluaisin siis pystyä kirjoittamaan samaan paikkaan, kuin mistä luen toisessa kohtaa ohjelmaani. Löytyisikö yhtä selkeää rekisteriin kirjoitus rimpsua kuin tämä siitä lukemis pätkä on:
char* WinRegRead (bool hkeyuser, string keypath, string keyname)
{
HKEY hKey;
DWORD buffersize = 1024;
char* lpData = new char[buffersize];
if (hkeyuser)
{
RegOpenKeyEx (HKEY_CURRENT_USER, keypath.c_str(), NULL, KEY_READ, &hKey);
}
else
{
RegOpenKeyEx (HKEY_LOCAL_MACHINE, keypath.c_str(), NULL, KEY_READ, &hKey);
}
RegQueryValueEx(hKey, keyname.c_str(), NULL, NULL, (LPBYTE) lpData, &buffersize);
RegCloseKey (hKey);
return lpData;
};Koodisi sisennyksissä on käytetty sekaisin välilyöntejä ja tabulaattoreita, kannattaa korjata, jos aikoo koodiaan joskus jakaa. Funktion loppuun ei myöskään standardin mukaan kuulu puolipistettä.
Kannattaa lueskella MSDN:stä niiden funktioiden kuvauksia, jotka nimen perusteella voisivat liittyä aiheeseen. Lista löytyy helposti, kun hakeudut jo käyttämistäsi funktioista kertoville sivuille. Jotain tällaista voisit kokeilla:
void WinRegWrite (bool hkeyuser, string keypath, string keyname, const string data) {
HKEY hKey = hkeyuser ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE;
RegSetKeyValue(hkey, keypath.c_str(), keyname.c_str(), REG_SZ, data.c_str(), data.length() + 1);
}Lukemistakin voisit parannella, jos datan tiedetään olevan tekstiä (REG_SZ). Ei nimittäin kannata käyttää itse new-operaattorilla varattuja muistialueita, jos ei ole erityistä syytä, koska niiden kanssa sattuu helposti virheitä, erityisesti muistivuotoja.
string WinRegRead (bool hkeyuser, string keypath, string keyname) {
HKEY hKey = hkeyuser ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE;
LONG size = 0;
vector<char> data;
RegOpenKeyEx(hKey, keypath.c_str(), NULL, KEY_READ, &hKey);
RegQueryValueEx(hKey, keyname.c_str(), NULL, NULL, NULL, &size);
data.resize(size);
RegQueryValueEx(hKey, keyname.c_str(), NULL, NULL, &data[0], &size);
RegCloseKey (hKey);
return string(&data[0]);
}Nämä Metabolixin kommentit kuulostavat välillä aika lytistäviltä :) (ei millään pahalla)
Samalla kysyn onko Win XP:lle jotain helppoa kirjastoa yms. kun rinnakkaisporttia ei näytä pystyvän suoraan lukea XP:ssa. Delphi tai C(++).
E: Kun tarkemmin luin kritiikki olikin vain rakentavaa, ei lytistävää ;).
Aihe on jo aika vanha, joten et voi enää vastata siihen.