在網上找了幾個關於遍歷串口的例子,要么代碼不完整,要么就有Bug,如讀不了串口號大於10以上的。
經過本人的整理,現分享最終代碼,vs2008下編譯通過。
//此方法同樣適用於遍歷windows開機啟動項,只需稍加修改即可.
void CEnumPortDlg::enumPort(void)
{
HKEY hKey;
LPCTSTR lpSubKey="HARDWARE\\DEVICEMAP\\SERIALCOMM\\";
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, KEY_READ, &hKey)!= ERROR_SUCCESS)
{
return ;
}
#define NAME_LEN 100
char szValueName[NAME_LEN];
BYTE szPortName[NAME_LEN];
LONG status;
DWORD dwIndex = 0;
DWORD dwSizeValueName=100;
DWORD dwSizeofPortName=100;
DWORD Type;
dwSizeValueName = NAME_LEN;
dwSizeofPortName = NAME_LEN;
do
{
status = RegEnumValue(hKey, dwIndex++, szValueName, &dwSizeValueName, NULL, &Type,
szPortName, &dwSizeofPortName);
if((status == ERROR_SUCCESS))
{
m_lstPort.AddString((char *)szPortName);
}
//每讀取一次dwSizeValueName和dwSizeofPortName都會被修改
//注意一定要重置,否則會出現很離奇的錯誤,本人就試過因沒有重置,出現讀不了COM大於10以上的串口
dwSizeValueName = NAME_LEN;
dwSizeofPortName = NAME_LEN;
} while((status!= ERROR_NO_MORE_ITEMS));
RegCloseKey(hKey);
}
