以下是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;
}