Re: RegQueryValueEx and UNICODE.
"William GS" <WilliamGS@discussions.microsoft.com> wrote in message
news:BBA023E8-CC5F-4F1A-93AA-64C0A7BCEBDA@microsoft.com...
Hello everybody. I Have a function to extract char data from the registry,
but I don't know if it is UNICODE compliant, this is my code:
BOOL CRegistry::Read (LPCTSTR pszKey, CString& sVal)
{
ASSERT(pszKey);
DWORD dwType;
DWORD dwSize;
LONG lReturn;
//m_hKey already is ok:
lReturn = ::RegQueryValueEx (m_hKey, pszKey, NULL, NULL, NULL, &dwSize);
if (lReturn != ERROR_SUCCESS)
return FALSE;
//Is this UNICODE compliant?
char *pszChain = (char*)malloc(dwSize + 1);
1. You probably want LPWSTR pszChain. In order to pass the pointer to
RegQueryValueEx you'll have to cast the pointer to LPBYTE, but everywhere
else that you use pszChain you'll find it easier to remember its actual
type.
2. dwSize + 1 will be enough bytes to append half of a Unicode null
terminator character onto whatever value you get from RegQueryValueEx. If
you're unsure whether RegQueryValueEx will null terminate the string that it
gives you, then you want dwSize + sizeof(_TCHAR).
if (!pszChain)
return FALSE;
dwSize++;
If you're unsure whether RegQueryValueEx will null terminate the string that
it gives you, then you want dwSize += sizeof(_TCHAR).
lReturn = ::RegQueryValueEx (m_hKey, pszKey, NULL, &dwType,
(LPBYTE)pszChain, &dwSize);
if (lReturn != ERROR_SUCCESS)
{
free(pszChain);
return FALSE;
}
sVal = pszChain;
free(pszChain);
return TRUE;
}
Thanks in advance,
William GS