使用getDefaultCommConfig使用无效的参数错误

Invalid parameter error using GetDefaultCommConfig

本文关键字:参数 错误 无效 getDefaultCommConfig 使用      更新时间:2023-10-16

我提出了相同的问题,其中我获得了一个lptstr portname param作为函数的输入。我必须将其转换为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);
}

我需要将此portname分配给l_comportname。我需要从此l_comportname创建一个com1的子字符串,并且我必须在getDafaultCommConfig()

中使用此子字符串。

您的错误是第二个参数,而不是第一个参数。您的调试语句被漏洞了,因为它不考虑宽字符串%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)