#include "pch.h" #pragma hdrstop #include "registry.h" LONG RegQueryDword ( IN HKEY hkey, IN LPCTSTR pszValueName, OUT LPDWORD pdwValue ) { LONG lr; DWORD dwType; DWORD dwSize; ASSERT (hkey); ASSERT (pszValueName); ASSERT (pdwValue); dwSize = sizeof(DWORD); lr = RegQueryValueEx ( hkey, pszValueName, NULL, &dwType, (LPBYTE)pdwValue, &dwSize); if (!lr && (REG_DWORD != dwType)) { *pdwValue = 0; lr = ERROR_INVALID_DATATYPE; } return lr; } LONG RegQueryValueWithAlloc ( IN HKEY hkey, IN LPCTSTR pszValueName, IN DWORD dwTypeMustBe, OUT LPBYTE* ppbData, OUT LPDWORD pdwSize ) { LONG lr; DWORD dwType; DWORD dwSize; ASSERT (hkey); ASSERT (pszValueName); ASSERT (ppbData); ASSERT (pdwSize); // Initialize the output parameters. // *ppbData = NULL; *pdwSize = 0; // Get the size of the buffer required. // dwSize = 0; lr = RegQueryValueEx ( hkey, pszValueName, NULL, &dwType, NULL, &dwSize); if (!lr && (dwType == dwTypeMustBe) && dwSize) { LPBYTE pbData; // Allocate the buffer. // lr = ERROR_OUTOFMEMORY; pbData = (LPBYTE)MemAlloc (0, dwSize); if (pbData) { // Get the data. // lr = RegQueryValueEx ( hkey, pszValueName, NULL, &dwType, pbData, &dwSize); if (!lr) { *ppbData = pbData; *pdwSize = dwSize; } else { MemFree (pbData); } } } else if (!lr) { lr = ERROR_INVALID_DATA; } return lr; } LONG RegQueryString ( IN HKEY hkey, IN LPCTSTR pszValueName, IN DWORD dwTypeMustBe, OUT PTSTR* ppszData ) { LONG lr; DWORD dwSize; ASSERT (hkey); ASSERT (pszValueName); lr = RegQueryValueWithAlloc ( hkey, pszValueName, dwTypeMustBe, (LPBYTE*)ppszData, &dwSize); return lr; } LONG RegQueryStringA ( IN HKEY hkey, IN LPCTSTR pszValueName, IN DWORD dwTypeMustBe, OUT PSTR* ppszData ) { LONG lr; PTSTR pszUnicode; ASSERT (hkey); ASSERT (pszValueName); ASSERT (ppszData); // Initialize the output parameter. // *ppszData = NULL; lr = RegQueryString ( hkey, pszValueName, dwTypeMustBe, &pszUnicode); if (!lr) { INT cb; INT cchUnicode = lstrlen (pszUnicode) + 1; // Compute the number of bytes required to hold the ANSI string. // cb = WideCharToMultiByte ( CP_ACP, // CodePage 0, // dwFlags pszUnicode, cchUnicode, NULL, // no buffer to receive translated string 0, // return the number of bytes required NULL, // lpDefaultChar NULL); // lpUsedDefaultChar if (cb) { PSTR pszAnsi; lr = ERROR_OUTOFMEMORY; pszAnsi = MemAlloc (0, cb); if (pszAnsi) { lr = NOERROR; // Now translate the UNICODE string to ANSI. // cb = WideCharToMultiByte ( CP_ACP, // CodePage 0, // dwFlags pszUnicode, cchUnicode, pszAnsi, // buffer to receive translated string cb, // return the number of bytes required NULL, // lpDefaultChar NULL); // lpUsedDefaultChar if (cb) { *ppszData = pszAnsi; } else { MemFree (pszAnsi); lr = GetLastError (); } } } MemFree (pszUnicode); } return lr; }