获取系统的所有串口

第一个思路应该是用建立串口的方式来取得串口名,若建立失败,则此串口不存在

void GetComList() { 
  CString strCom;
  
int nCom = 0;
  
int count = 0;
  HANDLE hCom;
  
do {
    nCom
++;
    strCom.Format(
"COM%d", nCom);
    hCom 
= CreateFile(strCom, 000, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    
if (INVALID_HANDLE_VALUE == hCom)
      
break;
    m_cbComList.AddString(strCom);
    CloseHandle(hCom);
  } 
while (1);


//-------------------------------------------------------------- - 

// 串口信息都是保存在注册表的这个位置的 // HKEY_LOCAL_MACHINEHARDWAREDEVICEMAPSERIALCOMM 
HKEY hKey; 
LONG ret; 
OSVERSIONINFO osvi; 
BOOL bOsVersionInfoEx; 
char keyinfo[100], 
     comm_name[
40], 
     ValueName[
40];
int i; 
DWORD sType, 
      Reserved, 
      cbData, 
      cbValueName;
hIcon 
= AfxGetApp() - > LoadIcon(IDI_HARDWARE); 
SetIcon(hIcon, 
false); 
ZeroMemory( 
& osvi, sizeof(OSVERSIONINFO)); 
osvi.dwOSVersionInfoSize 
= sizeof(OSVERSIONINFO); 
memset(keyinfo, 
0100); 
strcpy(keyinfo, 
"HARDWARE\DEVICEMAP\SERIALCOMM"); 
= 0
sType 
= REG_SZ; 
Reserved 
= 0
bOsVersionInfoEx 
= GetVersionEx( & osvi); 
ret 
= RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyinfo, 0, KEY_ALL_ACCESS, & hKey);
if (ret == ERROR_SUCCESS) { 
  
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
    
for (i = 1; i <= 128; i++) {
      sprintf(comm_name, 
"COM%d", i);
      
if (CommPortIsUsed(comm_name) == 1
        m_comlist.AddString(comm_name);
    }
  } 
else if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
    
do {
      cbData 
= 40;
      cbValueName 
= 40;
      memset(comm_name, 
040);
      memset(ValueName, 
040);
      ret 
= RegEnumValue(hKey, i, ValueName, & cbValueName, NULL, & sType, (LPBYTE) comm_name, & cbData);
      
if (ret == ERROR_SUCCESS) {
        
if (CommPortIsUsed(comm_name) == 1) m_comlist.AddString(comm_name);
        i
++;
      }
    } 
while (ret == ERROR_SUCCESS);
  }
}

 

posted on 2004-08-30 15:45  khan  阅读(1693)  评论(0编辑  收藏  举报

导航