您的位置:首页 > 编程语言 > C语言/C++

两种枚举串口的方式

2005-11-16 12:13 225 查看
以下是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  null byte c++