1、直接遍历:
int CZzcSerial::TraveralCom(vector<string>& vName, vector<string>& vzName)
{
int nNum = 0;
vName.clear();
for (int i = 0;i < 256;++i)
{
char szComName[MAX_PATH] = {0};
sprintf_s(szComName, "\\\\.\\COM%d", i);
HANDLE hPort = CreateFile(szComName,
GENERIC_READ | GENERIC_WRITE ,
0,
0,
OPEN_EXISTING,
0,
0);
if (INVALID_HANDLE_VALUE == hPort)
{
if (ERROR_ACCESS_DENIED == GetLastError())
{
//当前串口被占用
vzName.push_back(string(szComName));
}
}
else
{
++nNum;
vName.push_back(string(szComName));
CloseHandle(hPort);
hPort = INVALID_HANDLE_VALUE;
}
}
return nNum;
}
2、通过读取注册表:
void CZzcSerial::TraveralCom(vector<string>& vName)
{
HKEY hKey;
char szportName[MAX_PATH], szcommName[MAX_PATH];
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, //主键
"Hardware\\DeviceMap\\SerialComm", //子健
NULL,
KEY_READ, //权限
&hKey
))
{
int i = 0;
int mm = 0;
vName.clear();
DWORD dwLong, dwSize;
while (memset(szportName, 0, sizeof(szportName)) || memset(szcommName, 0, sizeof(szcommName)))
{
dwLong = dwSize = sizeof(szportName);
// 枚举串口
if (ERROR_NO_MORE_ITEMS == ::RegEnumValue(hKey, i, szportName, &dwLong, NULL, NULL, (PUCHAR)szcommName, &dwSize))
{
break;
}
vName.push_back(szcommName);
i++;
}
// 关闭注册表
RegCloseKey(hKey);
}
else
{
MessageBox(NULL,"读取注册表失败.","警告",MB_OK);
}
}