我正在尝试获取当前正在用它们在我的GUI中显示的比赛列表。
我正在使用以下代码:

   TCHAR szComPort[8];
   HANDLE hCom = NULL;
   char str[20];

   for (int i = 1; i <= 255; ++i)
   {
       if (i < 10)
         wsprintf(szComPort, ("COM%d"), i);
       else
         wsprintf(szComPort, ("\\\\.\\COM%d"), i);

       hCom = CreateFile(szComPort,
           GENERIC_READ|GENERIC_WRITE,
           0,
           NULL,
           OPEN_EXISTING,
           0,
           NULL);

       if (INVALID_HANDLE_VALUE != hCom)
       {
           sprintf_s(str,"COM%d",i);
           ui->COMLIST->addItem(str);
       }
       CloseHandle(hCom);
   }


这在我的笔记本电脑上可以正常工作,但是由于某种原因,它会导致PC 10或更高版本的QT崩溃(这意味着如果我将i
有任何想法吗?

谢谢!

最佳答案

szComPort缓冲区中有8个wchar,对于COM10及更高版本,您写10个字符,对于COM11及更高版本,您写11个字符。使缓冲区至少11个单位。

编辑:通常的做法是使缓冲区足够大,并具有足够的倾斜度,这样您就不必计算字符了。我可能只是看一下字符串,认为它有大约10个字符,所以对于格式化值,它不会导致30,并声明缓冲区32个项目。堆栈有足够的空间来容纳这几个额外的字节,并且您甚至都没有初始化它,因此不会降低性能,并且风险也较小。

10-06 05:22