//以下初始化串口COMBOX*************************************************
//从注册表中查看有几个串口
CString strSerialList[256]; // 临时定义 256 个字符串组,因为系统最多也就 256 个 
HKEY hKey;//得到要打开键的句柄
LPCTSTR data_Set = _T("HARDWARE\\DEVICEMAP\\SERIALCOMM\\");
long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey));
if (ret0 != ERROR_SUCCESS)
{
return -1;
}
int i = 0;
TCHAR Name[25];//我想这个地方有问题*************
                        //在非UNICODE下面是char Name[25]
UCHAR szPortName[25];
LONG Status;
DWORD dwIndex = 0;
DWORD dwName;
DWORD dwSizeofPortName;
DWORD Type;
dwName = sizeof(Name);
dwSizeofPortName = sizeof(szPortName);
do
{
Status = RegEnumValue(hKey, dwIndex++, Name, &dwName, NULL, &Type, szPortName, &dwSizeofPortName);
MessageBox(Name);
if ((Status == ERROR_SUCCESS) || (Status == ERROR_MORE_DATA))
{
strSerialList[i].Format(_T("%s"),szPortName);
m_cbxPort.AddString(strSerialList[i]);
i++; //串口计数
}
}while((Status == ERROR_SUCCESS) || (Status == ERROR_MORE_DATA));
RegCloseKey(hKey); m_cbxPort.SetCurSel(0); //串口COMBOX初始化完成**************************************************如果我把dwIndex++变成1,2,3,4,5数字
就可以得到正常的值。如果不直接用数据Name就一直是\Device\Serial1我想通过注册表得到有几个COM串口。有没有代码呀、
这个我搞了一个下午了。其实注册表里有COM1,COM5,COM6但通过这个函数只能得到COM5

解决方案 »

  1.   

    //以下初始化串口COMBOX*************************************************
    //从注册表中查看有几个串口
    CString strSerialList[256]; // 临时定义 256 个字符串组,因为系统最多也就 256 个 
    HKEY hKey;//得到要打开键的句柄
    LPCTSTR data_Set = _T("HARDWARE\\DEVICEMAP\\SERIALCOMM\\");
    long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey));
    if (ret0 != ERROR_SUCCESS)
    {
    return -1;
    }
    int i = 0;
    TCHAR Name[25];
    UCHAR szPortName[25];
    LONG Status;
    DWORD dwIndex = 0;
    DWORD dwName;
    DWORD dwSizeofPortName;
    DWORD Type;
    dwName = sizeof(Name);
    dwSizeofPortName = sizeof(szPortName);
    do
    {
    Status = RegEnumValue(hKey, dwIndex++, Name, &dwName, NULL, &Type, szPortName, &dwSizeofPortName);
    MessageBox(Name);
    if ((Status == ERROR_SUCCESS) || (Status == ERROR_MORE_DATA))
    {
    //strSerialList[i] = CString(szPortName);//串口字符串保存
    strSerialList[i].Format(_T("%s"),szPortName);
    m_cbxPort.AddString(strSerialList[i]);
    i++; //串口计数
    }
    }while((Status == ERROR_SUCCESS) || (Status == ERROR_MORE_DATA));
    RegCloseKey(hKey); m_cbxPort.SetCurSel(0); //串口COMBOX初始化完成**************************************************
      

  2.   

    如果我把dwIndex++变成1,2,3,4,5数字
    就可以得到正常的值。如果不直接用数据Name就一直是\Device\Serial1我想通过注册表得到有几个COM串口。有没有代码呀、
    这个我搞了一个下午了。其实注册表里有COM1,COM5,COM6但通过这个函数只能得到COM5