如题,我现在要获取电脑上有几个有效COM串口,然后展现给用户,请问有什么有效的方法来实现吗?需要成熟的建议。就是正规的实现方法。

解决方案 »

  1.   

    可以通过读取注册表中HEKY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM中内容来看COM的情况。
      

  2.   

    用一个循环从COM1到COM255遍历CreateFile打开串口就知道了
      

  3.   

    HKEY hKey;  
    int rtn;
    rtn = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Hardware\\DeviceMap\\SerialComm",   
      NULL, KEY_READ, &hKey);
    if( rtn == ERROR_SUCCESS)   //   打开串口注册表   
    {   
    int   i=0;   
    char   portName[256],commName[256];   
    DWORD   dwLong,dwSize;   
    while(1)   
    {   
    dwSize =   sizeof(portName);   
    dwLong   =   dwSize;
    rtn = RegEnumValue( hKey, i, portName, &dwLong,   
      NULL, NULL, (PUCHAR)commName, &dwSize );
    if( rtn == ERROR_NO_MORE_ITEMS )   //   枚举串口   
    break;   
    i++;   
    }   
    RegCloseKey(hKey);   
    }   
      

  4.   

    //从注册表中读取串口号
    HKEY   hKey;   
    CString strConn[20];
    long   lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Hardware\\DeviceMap\\SerialComm"), 0,KEY_READ,&hKey);   
                        
    //unsigned char strDSName[80]="\\Device\\Serial3";
    CString strDSName[20];
    for(int i=0;i<20;i++)
    strDSName[i].Format("\\Device\\Serial%d",i);LPBYTE  Conn_Get=new BYTE[80];   
    DWORD   type_2=REG_SZ;   
    DWORD   cbData_2=80;  
    i=0;
    while(i<20)
    {
        lResult = RegQueryValueEx(hKey,(LPCTSTR)strDSName[i],NULL,&type_2,
        Conn_Get,&cbData_2);  
        if(lResult== ERROR_SUCCESS)   
        {   
    strConn[i]   =   CString(Conn_Get);
        }   
        i++;
    }