RegQueryInfoKey()函数返回不同的值

时间:2016-04-13 14:15:54

标签: winapi mfc registry

RegQueryInfoKey 函数中,它会将错误的结果放入 dwcValues dwcMaxValueName dwcMaxValueData 值。 dwcValues 是连接了多少个端口,但它还有一个连接数甚至没有连接。

例如,当没有任何关联时,它会显示 dwcValues = 1, dwcMaxValueName = 17, dwcMaxValueData = 10。

如果连接了一个端口,则显示 dwcValues = 2, dwcMaxValueName = 17, dwcMaxValueData = 10.

我想知道为什么会这样,并解决这个问题。

CString CSerialPort::GetPortName()
{
    DWORD dwcSubKeys,dwcValues,dwcMaxSubKeyName,dwcMaxValueName,dwcMaxValueData;
    dwcSubKeys=dwcValues=dwcMaxSubKeyName=dwcMaxValueName=dwcMaxValueData=0;
    DWORD dwSubKeyIndex = 0;
    DWORD dwValueIndex = 0;
    HKEY hKey = 0;
    LONG lStatus = ERROR_SUCCESS;

    TCHAR szValueName[255] = {0};
    TCHAR szValueData[255] = {0};

    lStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("HARDWARE\\DEVICEMAP\\SERIALCOMM"),0,KEY_READ,&hKey);

    if (lStatus == ERROR_SUCCESS) {
        RegQueryInfoKey(hKey, NULL, NULL, 0,
            &dwcSubKeys, &dwcMaxSubKeyName, NULL,
            &dwcValues, &dwcMaxValueName, &dwcMaxValueData,
             NULL, NULL);

        if (dwcValues != 0) {
            do {
                DWORD dwcValueName = sizeof(szValueName);
                DWORD dwcValueData = sizeof(szValueData);
                lStatus = RegEnumValue(hKey, dwValueIndex,
                        szValueName, &dwcValueName,
                        NULL, NULL,
                        (BYTE*)szValueData,
                        &dwcValueData);
                dwValueIndex++;
            } while (lStatus == ERROR_SUCCESS);
        }
        RegCloseKey(hKey);
    }
    return szValueData;
}

0 个答案:

没有答案