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.