串口编程-枚举遍历串口、获取PC所有串口名称、遍历注册表项、RegEnumValue用法

在网上找了几个关于遍历串口的例子,要么代码不完整,要么就有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); 

} 

  

转自: http://www.gzzsc.net

posted @ 2015-02-12 11:40  2524187945  阅读(8096)  评论(2编辑  收藏  举报