在开发一个Modbus的串口监测工具软件的时候,启动工具软件,希望一开始就能在下拉框检测到当前有效的USB串口。
刚开始做的时候是用的穷举法,就是“COM0”~“COM15”一个一个尝试打开。但是,这样做一个是效率低下,另一个是换了新的USB-串口适配器,有可能虚拟串口端口号超过了COM15,这样就找不到可用串口了。网上查找了资料,通过读取windows注册表的方式,很好解决了这个问题。
void CSerialCtrlDemoDlg::GetAllCom(void)
{
long lReg;
HKEY hKey;
DWORD MaxValueLength;
DWORD dwValueNumber;
lReg=RegOpenKeyExA(HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", 0, KEY_QUERY_VALUE, &hKey);
if(lReg!=ERROR_SUCCESS)
{
AfxMessageBox("Please check comport!\n");
return;
}
lReg=RegQueryInfoKeyA( hKey,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
&dwValueNumber, //返回和hKey关联的值
&MaxValueLength,
NULL,
NULL,
NULL);
if( lReg != ERROR_SUCCESS )
{ //没有成功
AfxMessageBox("Getting Info Error!\n");