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

:
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.