两种枚举串口的方式

来源:互联网 发布:网络直播平台哪个最火 编辑:程序博客网 时间:2024/05/16 12:33

以下是C++ Builder下调试过的两种枚举系统串口的代码

/* 函数名 : GetSerialPortsReg
*  说  明 : 通过注册表枚举系统串口数量,并列出所有串口的系统名
*
*  参  数 : pListStr, 串口名称列表
*  返回值 : int, 系统串口个数
*/
int GetSerialPortsReg(char (*pListStr)[80])
{
    HKEY hKey;
    LPCTSTR data_Set="HARDWARE//DEVICEMAP//SERIALCOMM//";
    long ret0 = (::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKey));

    if(ret0 != ERROR_SUCCESS)
    {
        return -1;
    }

    int i = 0;
    CHAR Name[25];
    UCHAR szPortName[80];
    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);

        if((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA))
        {
            if (pListStr != NULL)
            {
                memcpy(*(pListStr + i), (LPCSTR)szPortName, 80);
            }
            i++;
        }
    } while((Status == ERROR_SUCCESS)||(Status == ERROR_MORE_DATA));

    RegCloseKey(hKey);

    return i;
}

/* 函数名 : GetSerialPortsSys
*  说  明 : 通过系统信息枚举系统串口数量,并列出所有串口的系统名
*
*  参  数 : pListStr, 串口名称列表
*  返回值 : int, 系统串口个数
*/
int GetSerialPortsSys(char (*pListStr)[80])
{
    DWORD pcReturned = 0;
    DWORD pcbNeeded = 0;
    BYTE *outb = NULL;

    EnumPorts(NULL, 2, outb, 0, &pcbNeeded, &pcReturned);
    outb = new byte[pcbNeeded];
    EnumPorts(NULL, 2, &outb[0], pcbNeeded, &pcbNeeded, &pcReturned);
    PORT_INFO_2 *portsArray ;
    portsArray = (PORT_INFO_2 *)(outb);

    for (unsigned int i = 0; i< pcReturned; i++)
    {
        if (((AnsiString)(*(portsArray + i)).pPortName).Pos("COM") > 0)
        {
            memcpy(*(pListStr + i), (*(portsArray + i)).pPortName, 80);
        }
    }

    return pcReturned;
}