使用GetDefaultCommConfig的无效参数错误

时间:2019-02-14 07:32:09

标签: c++ string windows

我遇到了同样的问题,在该问题中,我从函数中获得了LPTSTR端口名参数作为输入。我必须将其转换为wstring,以便获取端口参数。

下面是试图将lptstr复制到wstring的代码段。

         void C_PORT_MONITOR::SetPrinterComPortParam(LPTSTR   PortName)
          {
          #ifdef _UNICODE
          std::wstring          l_ComPortName;
          #else
          std::string               l_ComPortName;
          #endif
         DWORD dwSize,le = 0;
      dwSize = sizeof(COMMCONFIG);
     LPCOMMCONFIG lpCC = (LPCOMMCONFIG) new BYTE[dwSize];
     l_ComPortName = PortName;//mPortName;  
        if(l_ComPortName.length() <= 0 )
        return;
   bool SetFlag = false;
 //Get COMM port params called to get size of config. block
  int length = l_ComPortName.length();
  int iPos = l_ComPortName.find_first_of(':'); 
  int iChc = length- iPos; //remove the charactrers after :
  l_ComPortName = l_ComPortName.substr(0, (length- iChc)); //remove the characters from colon  //COM1
//Get COMM port params with defined size
   BOOL ret = GetDefaultCommConfig(l_ComPortName.c_str(), lpCC, &dwSize);  
_RPT1(_CRT_WARN, "C_PORT_MONITOR::SetPrinterComPortParam length=%x,iPos=%x,iChc=%x,l_ComPortName=%s",length, iPos, iChc, l_ComPortName);
if(!ret)
{
    le = GetLastError();
    _RPT1(_CRT_WARN ,"C_PORT_MONITOR::SetPrinterComPortParam LastError=%x",le);
}

我需要将此端口名分配给l_comportname。我需要从此l_comportname作为COM1创建一个子字符串,并且必须在getdafaultcommconfig()中使用该子字符串

1 个答案:

答案 0 :(得分:1)

您的错误是第二个参数,而不是第一个。您的调试语句有问题,因为它不能解释宽字符串%s仅用于窄字符串,您应该对宽字符串使用%S

这是真正的错误

 dwSize = sizeof(COMMCONFIG);
 LPCOMMCONFIG lpCC = (LPCOMMCONFIG) new BYTE[dwSize];
 lpCC->dwSize = sizeof(COMMCONFIG); // this line is needed

您可能也需要它(文档不是很清楚)

 lpCC->wVersion = 1;

在Windows编程中,很常见,您必须使用结构的大小来初始化结构。

参考:https://technet.microsoft.com/en-us/aa363188(v=vs.90)