C++ 使用GetDefaultCommConfig时出现无效参数错误

C++ 使用GetDefaultCommConfig时出现无效参数错误,c++,string,windows,C++,String,Windows,我提出了同样的问题,在这个问题中,我从一个函数获得了一个LPTSTR portname参数作为输入。我必须将其转换为wstring,以便获取端口参数 下面是我试图将lptstr复制到wstring的代码片段 void C_PORT_MONITOR::SetPrinterComPortParam(LPTSTR PortName) { #ifdef _UNICODE std::wstring l_Co

我提出了同样的问题,在这个问题中,我从一个函数获得了一个LPTSTR portname参数作为输入。我必须将其转换为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);
}
void C_PORT_MONITOR::SetPrinterComPortParam(LPTSTR端口名)
{
#ifdef_UNICODE
std::wstring l_ComPortName;
#否则
std::字符串l_ComPortName;
#恩迪夫
DWORD dwSize,le=0;
dwSize=sizeof(COMMCONFIG);
LPCOMMCONFIG lpCC=(LPCOMMCONFIG)新字节[dwSize];
l_ComPortName=PortName;//mPortName;

如果(l_ComPortName.length()您的错误是第二个参数,而不是第一个参数。调试语句有错误,因为它不考虑宽字符串
%s
仅用于窄字符串,您应该使用
%s
处理宽字符串

这是真正的错误

 dwSize = sizeof(COMMCONFIG);
 LPCOMMCONFIG lpCC = (LPCOMMCONFIG) new BYTE[dwSize];
 lpCC->dwSize = sizeof(COMMCONFIG); // this line is needed
您可能也需要这个(文档不是很清楚)

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


Ref:

那么,当您尝试这段代码时(因为我觉得它还可以)会出现什么错误?getdafaultcommconfig()失败,最后出现错误57(无效参数)。因此我怀疑它的第一个参数。同样,我应该将l_Comportparam.c_str()作为“com1”,但只得到“c”@Christophe我同意结束这个问题,但我看不出这是你链接的问题的重复。在这里提问者没有说他有运行时错误。在我看来,重复的问题根本不正确。OP在转换时没有出现错误(事实上,他似乎根本没有进行转换)@JanuSasi从您最初的问题中根本不清楚这是一个运行时错误,我假设您有一个编译器错误。现在这看起来像是您代码中的某个错误,甚至可能不是您发布的代码中的错误。函数入口的
PortName
值是多少?+1用于您理解和解决不清楚的问题uestion和提供一个有用的答案来澄清函数的正确用法。但是,只有当其他人能够根据清晰的问题标题识别类似的问题时,它才会对社区有所帮助…@Christophe谢谢,我已将其改为更中性的问题。@john..谢谢你的帮助。实际上我怀疑类型转换,这就是我命名这样的标题。无论如何,感谢您更改了主题。正如您所说,我尝试初始化lpCC->dwSize和lpCC->wVersion。而且我还将类型说明符更改为%S,在更改说明符后,我得到了“字符串太长或IO错误”。我无法获得正确的输出。getdafaultcommconfig()仍然存在失败,出现最后一个错误57。仍然不确定函数调用中的参数有什么问题。@Janusai不幸的是,我对这些函数不太熟悉,我只是浏览文档。因此,
GetDefaultCommConfig
的一个功能是,您无法提前知道第二个参数需要多少内存。如果如果太小,则函数会失败,但您确实需要的空间量会在第三个参数中返回。因此,您经常需要调用它两次,第一次只需找出您真正需要的空间量,第二次应该可以工作。可能您也遇到了这种情况。@JanuSasi Windows 10中也有一个已知的错误,请参见此处。这个问题也是有一些调用
GetDefaultCommConfig
的示例代码,包括像我上面解释的那样调用它两次。
 lpCC->wVersion = 1;