WINCE6 下枚举当前可用串口

时间:2022-12-31 17:37:57

转自:http://www.armce.cn/bbs/thread-188-1-1.html

 

原理其实非常简单,利用注册表查找在线的设备来枚举可用的串口
注册表位置及步骤:
1、取串口
HKEY_LOCAL_MACHINE/Drivers/Active/*

2、取COM设备键值Key名称

3、取来的键值  (eg. Drivers/BuiltIn/Serial)
HKEY_LOCAL_MACHINE/Drivers/BuiltIn/Serial

4、取FriendlyName友好名称值(eg.Serial Cable on COM1:)
取其它设置在这里省略了(eg. IRQ、DLL、Port...... )

  1. //************************************************************************
  2. //    Popzone@ARMCE  VS2005 学习代码片断:
  3. //    Data : 2009.06.01
  4. //************************************************************************
  5. //    sub1  OpenActiveDriverKey 查询在线可用驱动
  6. //    sub2  GetKeyValue              取键值内容
  7. //    main  EnumeratePorts         枚举端口
  8. //************************************************************************
  9. 子函数:
  10. LONG OpenActiveDriverKey(LPCTSTR pszDriver, HKEY *phKey)
  11. {
  12.         CString        strFullName(_T("Drivers//Active//"));
  13.         LONG        lRes;
  14.         strFullName += pszDriver;
  15.         lRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, strFullName, 0, KEY_READ, phKey);
  16.         return lRes;
  17. }
  18. 子函数:
  19. LONG GetKeyValue(HKEY hKey, LPCTSTR pszValueName, CString &strValue)
  20. {
  21.         LONG        lRes;
  22.         DWORD        dwSize        = 0,
  23.                         dwType;
  24.         lRes = RegQueryValueEx(hKey, pszValueName, NULL, &dwType, NULL, &dwSize);
  25.         if(lRes == ERROR_SUCCESS)
  26.         {
  27.                 TCHAR*        pszValue = new TCHAR[dwSize / sizeof(TCHAR)];
  28.                 if(pszValue != NULL)
  29.                 {
  30.                         lRes = RegQueryValueEx(hKey, pszValueName, NULL, &dwType, (BYTE*)pszValue, &dwSize);                               
  31.                                
  32.                         if(lRes == ERROR_SUCCESS)
  33.                                 strValue = pszValue;
  34.                         delete [] pszValue;
  35.                 }
  36.                 else
  37.                         lRes = ERROR_NOT_ENOUGH_MEMORY;
  38.         }
  39.         return lRes;
  40. }
  41. 主代码:
  42. void CEmunCommPortDlg::EnumeratePorts()
  43. {
  44.                 HKEY        hKey;
  45.                 LONG        lRes;
  46.                 int        iItem = 0;
  47.                 lRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Drivers//Active"), 0, KEY_READ, &hKey);
  48.                 if(lRes == ERROR_SUCCESS)
  49.                 {
  50.                         DWORD        dwIndex;
  51.                         for(dwIndex = 0; ; ++dwIndex)
  52.                         {
  53.                                 TCHAR        szKeyName[128];
  54.                                 DWORD        dwNameSize        = 128;
  55.                                 lRes = RegEnumKeyEx(hKey, dwIndex, szKeyName, &dwNameSize, NULL, NULL, NULL, NULL);
  56.                                 if(lRes == ERROR_SUCCESS)
  57.                                 {
  58.                                         HKEY        hKeyDrv;
  59.                                         lRes = OpenActiveDriverKey(szKeyName, &hKeyDrv);
  60.                                         if(lRes == ERROR_SUCCESS)
  61.                                         {
  62.                                                 CString        strDriverName,     //驱动名称
  63.                                                         strDriverKey,        //驱动建值
  64.                                                         strFriendlyName;  //友好名称
  65.                                                 if(GetKeyValue(hKeyDrv, _T("Name"), strDriverName) == ERROR_SUCCESS)
  66.                                                 {
  67.                                                         CString        strPrefix(strDriverName.Left(3));
  68.                                                         // 验证COMM Port端口
  69.                                                         if(strPrefix.CompareNoCase(_T("COM")) == 0)
  70.                                                         {
  71.                                                                 if(GetKeyValue(hKeyDrv, _T("Key"), strDriverKey) == ERROR_SUCCESS)
  72.                                                                 {
  73.                                                                         HKEY        hKeyBase;
  74.                                                                         lRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, strDriverKey, 0, KEY_READ, &hKeyBase);
  75.                                                                         if(lRes == ERROR_SUCCESS)
  76.                                                                         {
  77.                                                                                 GetKeyValue(hKeyBase, _T("FriendlyName"), strFriendlyName);
  78.                                                                                 RegCloseKey(hKeyBase);
  79.                                                                         }
  80.                                                                 }
  81.                                                                 //这是我用的ListContorl,你们可以自行定义输出:
  82.                                                                 //iItem = lst_CommPortList.InsertItem(iItem,strDriverName);
  83.                                                                 //lst_CommPortList.SetItemText(iItem,1,strFriendlyName);
  84.                                                         }
  85.                                                 }
  86.                                                 RegCloseKey(hKeyDrv);
  87.                                         }
  88.                                 }
  89.                                 else
  90.                                         break;
  91.                         }
  92.                         RegCloseKey(hKey);
  93.                 }
  94.         }
复制代码