我想知道当前系统能用的串口
用SetupDiGetDeviceRegistryProperty 来得到信息
但是 如果参数是SPDRP_FRIENDLYNAME
可以得到 “通讯端口(com1)”的字样 有没有办法直接得到 com1 或com2 类似的?

解决方案 »

  1.   

    除了SPDRP_FRIENDLYNAME外,还有15个参数,都试过了?
      

  2.   

    如果试过后还是没有,那么只能得到“通讯端口(com1)”后进行截取了。
      

  3.   

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

  4.   

    /* -------- 从注册表里搜寻安装的串口 -----------------------
    Win2k/XP和Win98/Me的注册表值不同,所以用枚举
        把串口名字写入一个ComboBox控件里
      */
    void FindCommPort( CComboBox *pComboBox )
    {
    HKEY hKey;#ifdef _DEBUG
        ASSERT( pComboBox != NULL );
        pComboBox->AssertValid();
    #endif    if( ::RegOpenKeyEx( HKEY_LOCAL_MACHINE,
        "Hardware\\DeviceMap\\SerialComm",
        NULL,
        KEY_READ,
        &hKey ) == ERROR_SUCCESS ) // 打开串口注册表
    {
    int i=0;
    char portName[256],commName[256];
    DWORD dwLong,dwSize; while(1)
    {
    dwLong = dwSize = sizeof(portName);
                if( ::RegEnumValue( hKey,
      i,
      portName,
      &dwLong,
      NULL,
      NULL,
      (PUCHAR)commName,
      &dwSize ) == ERROR_NO_MORE_ITEMS )    // 枚举串口
    break; pComboBox->AddString( commName );                     // commName就是串口名字
    i++;
    } if( pComboBox->GetCount() == 0 )
    {
    ::AfxMessageBox( "在HKEY_LOCAL_MACHINE:Hardware\\DeviceMap\\SerialComm里找不到串口!!!" );
    } RegCloseKey(hKey);
    }
    }