I want to display these registry key values:
- MSSQL12.MSSQLSERVER
- MSSQL15.SQLEXPRESS
- MSSQL11.TEW_SQLEXPRESS
Code:
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\Microsoft SQL Server\\Instance Names\\SQL"),
0,
KEY_READ | KEY_WOW64_64KEY,
&hKey) == ERROR_SUCCESS){
DWORD i, retCode, cchName, buflen;
TCHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name
DWORD cbName; // size of name string
TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name
DWORD cchClassName = MAX_PATH; // size of class string
DWORD cSubKeys = 0; // number of subkeys
DWORD cbMaxSubKey; // longest subkey size
DWORD cchMaxClass; // longest class string
DWORD cValues; // number of values for key
DWORD cchMaxValue; // longest value name
DWORD cbMaxValueData; // longest value data
DWORD cbSecurityDescriptor; // size of security descriptor
FILETIME ftLastWriteTime; // last write time
retCode = RegQueryInfoKey(
hKey, // key handle
achClass, // buffer for class name
&cchClassName, // size of class string
NULL, // reserved
&cSubKeys, // number of subkeys
&cbMaxSubKey, // longest subkey size
&cchMaxClass, // longest class string
&cValues, // number of values for this key
&cchMaxValue, // longest value name
&cbMaxValueData, // longest value data
&cbSecurityDescriptor, // security descriptor
&ftLastWriteTime); // last write time
result = RegGetValue(
hKey, NULL, L"MSSQLSERVER",
RRF_RT_REG_SZ, 0, buf, &bufsz);
if (result != ERROR_SUCCESS) {
printf("Failed read value");
_getch();
return -1;
}
wprintf(L"%s\n", buf);
}
I need to replace L"MSSQLSERVER" with the variable keyName, but I don't understand how to do that. I'm trying to write the name of the key to a variable.
LPWSTR aResult;
LPSTR keyName;
RegEnumKeyExA(hKey, i, keyName, &cchName, NULL, NULL, NULL, NULL);
MultiByteToWideChar(0, 0, keyName, -1, aResult, 0);
result = RegGetValue(
hKey, NULL, aResult,
RRF_RT_REG_SZ, 0, buf, &bufsz);
But I think it's wrong. Here keyName is NULL. And keyName is LPSTR, but RegGetValue() needs LPCWSTR.


It turned out that my task needed names, not values. And only SQL Express. Here is the code: