为什么GetDefaultCommConfig在Windows 10上失败

时间:2015-07-17 18:26:00

标签: c++ winapi serial-port

我使用以下代码验证计算机上的串行端口名称是否有效:

typedef std::pair<StrAsc const, bool> port_pair_type;
typedef std::list<port_pair_type> port_pairs_type;
port_pairs_type pairs;
StrBin config_buffer;
 config_buffer.fill(0,sizeof(COMMCONFIG));
while(!pairs.empty())
{
   port_pair_type pair(pairs.front());
   pairs.pop_front();
   if(!pair.second)
   {
      // we need to get the default configuration for the port.  This may
      // require some fudging on the buffer size.  That is why two calls
      // are being made.
      uint4 config_size = config_buffer.length();
      StrUni temp(pair.first);
      COMMCONFIG *config(reinterpret_cast<COMMCONFIG *>(config_buffer.getContents_writable()));
      config->dwSize = sizeof(COMMCONFIG);
      rcd = GetDefaultCommConfigW(
         temp.c_str(), config, &config_size);
      if(!rcd && config_buffer.length() < config_size)
      {
         config_buffer.fill(0, config_size);
         config = reinterpret_cast<COMMCONFIG *>(config_buffer.getContents_writable());
         config->dwSize = sizeof(COMMCONFIG);
         rcd = GetDefaultCommConfigW(
            temp.c_str(),
            reinterpret_cast<COMMCONFIG *>(config_buffer.getContents_writable()),
                 &config_size);
      }

      // if the call succeeded, we can go ahead and look at the
      // configuration structure.
      if(rcd)
      {
         COMMCONFIG const *config = reinterpret_cast<COMMCONFIG const *>(
         config_buffer.getContents());
         if(config->dwProviderSubType == PST_RS232)
            port_names.push_back(pair.first);
      }
      else
      {
         OsException error("GetDefaultCommConfig Failed");
         trace("\"%s\"", error.what());
      }
   }
   else
      port_names.push_back(pair.first);
}

在Windows 10上,当尝试确认使用usbser.sys的串行端口时,对GetDefaultCommConfig()的调用失败,GetLastError()返回的错误代码为87(无效参数)。据我所知,usbser.sys驱动程序已在Windows 10上重写,我怀疑这是该驱动程序的问题。是否有其他人知道可能出现的问题?

2 个答案:

答案 0 :(得分:3)

这是usbser.sys中的一个错误,并已于2016年1月27日在Windows 10更新KB3124262中修复。

微软员工解释说:

  

HKLM \ HARDWARE \ DEVICEMAP \ SERIALCOMM注册表中的COM端口名称未以NULL结尾。

Related discussion on MSDN

由于Windows 10的更新政策,此问题将来不再出现。

答案 1 :(得分:-1)

当您第二次调用GetDefaultCommConfigW时,可能需要config->dwSize到新大小的结构。例如:

config->dwSize = config_size;