Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Windowsin rekisteri

hyprE [09.12.2008 09:45:24]

#

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;
};

Metabolix [10.12.2008 16:01:01]

#

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]);
}

alottelijaa [10.12.2008 16:20:08]

#

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ää ;).

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta