繁体   English   中英

C++ 从注册表中读取值

[英]C++ Read values from the registry

我想显示这些注册表项值:

  1. MSSQL12.MSSQLSERVER
  2. MSSQL15.SQLEXPRESS
  3. MSSQL11.TEW_SQLEXPRESS

登记处

代码:

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);
}

我需要用变量keyName替换L"MSSQLSERVER" ,但我不明白该怎么做。 我正在尝试将键的名称写入变量。

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);

但我认为这是错误的。 这里的keyNameNULL 并且keyNameLPSTR ,但RegGetValue()需要LPCWSTR

事实证明,我的任务需要名称,而不是值。 并且只有 SQL 快递。 这是代码:

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
        L"SOFTWARE\\Microsoft\\Microsoft SQL Server\\Instance Names\\SQL",
        0,
        KEY_READ | KEY_WOW64_64KEY,
        &hTestKey) == ERROR_SUCCESS
        )
while (RegEnumValueW(hTestKey, index, (wchar_t*)valueName.c_str(), &lppchValueName, 0, 0, 0, 0) == ERROR_SUCCESS) 
        {
            lppchValueName = MAX_PATH;
            buffSize = MAX_PATH;
            if (RegQueryValueExW(hTestKey, valueName.c_str(), 0, 0, (LPBYTE)value.c_str(), &buffSize) == ERROR_SUCCESS)
            {
                if (value.find(L"Express") != std::wstring::npos || value.find(L"EXPRESS") != std::wstring::npos || value.find(L"express") != std::wstring::npos)
                {
                    // Here is an array entry.
                }
            }
            index++;
            memset((void*)valueName.c_str(), 0, MAX_PATH);
            memset((void*)value.c_str(), 0, MAX_PATH);
        }

看起来必须使用 unicode,注意L "...." 和 LP W STR

    LPWSTR  keyName = L"MSSQL12.MSSQLSERVER";
    result = RegGetValue(
                hKey, NULL, keyName ,                    
                RRF_RT_REG_SZ, 0, buf, &bufsz);

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM