Citire registry cu CRegKey

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

Citire registry cu CRegKey

Post by rdenis » 12 Jul 2010, 15:15

buna tuturor...revin cu o alta "durere"...incerc sa citesc o valoare din registry si am inteles ca singura solutie este sa folosesc CRegKey....pana aici totul e bine...am cautat clasa prin MSDN, am gasit toti membrii de care aveam nevoie, asa ca m-am pus pe treaba....
programul meu are nevoie sa scrie o valoare in registry (partea asta merge foarte bine) si sa citeasca alta...

eu am urmatorul cod, care luandu=ne dupa ce scrie pe MSDN, este perfect valabil:

Code: Select all

     LPTSTR path = 0;
	ULONG* nChr = 0;

    cReg = new CRegKey();  

	cReg->Open(HKEY_LOCAL_MACHINE,L"SOFTWARE\\testapp",KEY_ALL_ACCESS);
	
	cReg->QueryStringValue(L"Path", path, nChr);

	tMsg.SetWindowTextW(path);

la compilare nu primesc nici o eroare, insa la rulare cand trebuie sa citeasca din registry imi da DEBUG ASSERTION FAILED, Expression: m_hKey!=0...

aveti vreo sugestie?
ps: nu folosesc MFC...e un proiect WTL DIALOG based.

va multumesc anticipat....
Denis



User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Citire registry cu CRegKey

Post by cristianamarie » 12 Jul 2010, 15:29

1. Nu testezi daca Open reuseste. Cred ca intoarce access denied.
2. Nu poti pasa un LPTSTR path = 0; la QueryStringValue. Incearca un TCHAR szPath[MAX_PATH]; si in nChr = _countof(szPath).
Nuclear launch detected

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Citire registry cu CRegKey

Post by Marius Bancila » 12 Jul 2010, 15:54

Mai demult am facut niste clase C++ (no MFC) pentru citit/scris din Registry. Daca te intereseaza le poti gasi aici: http://mariusbancila.ro/blog/2007/05/16 ... try-in-vc/.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

Re: Citire registry cu CRegKey

Post by rdenis » 12 Jul 2010, 19:32

va multumesc pentru raspunsuri...
cristianamarie, am folosit LPRSTR pentru ca atunci cand incercam CString imi dadea eroare ca nu e declarat desi am citit pe internet ca CString ar exista in pack-ul WTL...am modificat codul dupa cum mi-ai recomandat si acum imi genereaza un ACCESS VIOLATION reading memory la linia aceasta:

Code: Select all

nBytes = (*pnChars)*sizeof(TCHAR);
in atlbase.h

ma gandesc ca sigur am gresit eu aici :biggrin: :

Code: Select all

nChr =(ULONG*) _countof(LPSpath);

cReg->QueryStringValue(L"Path", szPath, nChr);
marius: daca imi face viata mai usoara sigur ma intereseaza insa programul desi va fi dat gratuit clientilor e totusi pentru o firma facut si nu imi pot permite sa incalc nicio licenta...imi poti spune ce licenta e aplicata pentru clasele tale in eventualitatea in care le voi putea utiliza??

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Citire registry cu CRegKey

Post by Marius Bancila » 12 Jul 2010, 21:46

Exista in link exemple de utilizare.

Cat despre licenta, e free for all, atat timp cat pastrezi comentariile de copyright din headere (un fel de creative commons ad-hoc). Iar daca asta e o problema, ce sa zic, inspira-te din ce am scris eu. ;)
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Citire registry cu CRegKey

Post by cristianamarie » 13 Jul 2010, 08:04

rdenis wrote:va multumesc pentru raspunsuri...
cristianamarie, am folosit LPRSTR pentru ca atunci cand incercam CString imi dadea eroare ca nu e declarat desi am citit pe internet ca CString ar exista in pack-ul WTL...am modificat codul dupa cum mi-ai recomandat si acum imi genereaza un ACCESS VIOLATION reading memory la linia aceasta:

Code: Select all

nBytes = (*pnChars)*sizeof(TCHAR);
in atlbase.h

ma gandesc ca sigur am gresit eu aici :biggrin: :

Code: Select all

nChr =(ULONG*) _countof(LPSpath);

cReg->QueryStringValue(L"Path", szPath, nChr);
marius: daca imi face viata mai usoara sigur ma intereseaza insa programul desi va fi dat gratuit clientilor e totusi pentru o firma facut si nu imi pot permite sa incalc nicio licenta...imi poti spune ce licenta e aplicata pentru clasele tale in eventualitatea in care le voi putea utiliza??
nBytes nu mai stiu ce e, dar din nume e marimea in BYTES a buffer-ului pasat la apelul read.
Cam asa ar veni:

Code: Select all

TCHAR szPath[MAX_PATH];
DWORD cbSize = _countof(szPath) * sizeof(TCHAR); // Unicode sizeof(TCHAR) == 2 (2 BYTEs), ANSI sizeof(TCHAR) == 1 (1 BYTE)
DWORD cchSize = _countof(szPath);
cb = count in bytes, cch = count in characters

Si revenind la treaba noastra, cred ca merge cu

Code: Select all

TCHAR szPath[MAX_PATH];
ULONG nChars = _countof(szPath); // size e in characters
CRegKey key; // nu trebuie facut cu new, de ce sa ai grija unui pointer in plus?
if(key.Open(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\testapp"), KEY_READ) == ERROR_SUCCESS) // KEY_READ daca vrei doar read
{
  if(key.QueryStringValue(_T("Path"), szPath, &nChars) == ERROR_SUCCESS) // aici pot surveni multe, inclusiv ERROR_MORE_DATA == read-ul e ok, dar buffer-ul szPath e prea mic
  {
      // szPath e ok
  }
  else
  {
    // error reading value
  }
}
else
{
  // error opening key
}
nChars e ULONG* pentru ca e parametru input/output.
La input contine marimea buffer-ului meu in caractere, adica MAX_PATH. Cind functia intoarce (success sau more data), contine numarul ACTUAL de caractere.
Ca exemplu, daca in valoarea din registry este "C:\Temp", nChars intra cu 260 sau cit e MAX_PATH, dar la return o sa fie 8 (lungimea lui C:\Temp care e 7 PLUS null terminating char).

Toate explicatiile sint aici.

CString: probabil trebuie inclus atlstr.h, sau, daca e stringul WTL, poate are nevoie de using namespace WTL; sau de WTL::CString.
ATL si WTL se cam ciondanesc la CString, nu e foarte grozava scrisa treaba.
Sint niste macrouri _WTL_NO_CSTRING si _WTL_USE_CSTRING sint cele din WTL, __ATLSTR_H__ e cel din ATL. Se poate ajunge intr-un fisier sa contina definitiile de la CString si de la WTL si de la ATL, prefixeaza cu namespace-ul de unde vrei sa folosesti CString, gen ATL::CString.

Ca o regula, daca CRegKey e din ATL, foloseste stringul ATL.
Nuclear launch detected

rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

Re: Citire registry cu CRegKey

Post by rdenis » 13 Jul 2010, 13:29

multumesc cristianamarie...functioneaza perfect codul...se pare ca trebuie sa mai trec odata prin cartea de c++, in special prin capitolul poainters.... :)

User avatar
cristianamarie
Membru++
Membru++
Posts: 480
Joined: 12 Mar 2009, 18:47
Judet: Iaşi
Location: Iasi

Re: Citire registry cu CRegKey

Post by cristianamarie » 13 Jul 2010, 14:36

rdenis wrote:multumesc cristianamarie...functioneaza perfect codul...se pare ca trebuie sa mai trec odata prin cartea de c++, in special prin capitolul poainters.... :)
Nu toti facem asta zilnic? :)
Nuclear launch detected

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: Citire registry cu CRegKey

Post by Dragos Cojocari » 13 Jul 2010, 14:42

cristianamarie wrote:
rdenis wrote:multumesc cristianamarie...functioneaza perfect codul...se pare ca trebuie sa mai trec odata prin cartea de c++, in special prin capitolul poainters.... :)
Nu toti facem asta zilnic? :)
Din pacate nu. :)) Unii trec zilnic prin cartile de JavaScript, Java si alti verisori ( de la tara) de-ai lui C++.

rdenis
Membru
Membru
Posts: 50
Joined: 10 Apr 2010, 20:16
Judet: Iaşi

Re: Citire registry cu CRegKey

Post by rdenis » 14 Jul 2010, 18:11

like a side note: si eu mi-am petrecut mult timp in vb6, vb.net si acum nu mai stiu nici ca adaug 2 var TCHAR :(
dotNet te ajuta insa te face sa uiti si multe :yes:

Post Reply