阅读符合QT通过winapi

Reading comport with QT through winapi

本文关键字:通过 winapi QT      更新时间:2023-10-16

我正在尝试获取当前用于在我的 GUI 中呈现它们的 comports 列表。我正在使用以下代码:

   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<=255 更改为 i<=9,它可以正常工作),

有什么想法吗?

谢谢!

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

编辑:通常的做法是使缓冲区足够大,有足够的倾斜,这样你就不必计算字符数。我可能只看字符串,认为它有大约 10 个字符,所以对于格式化值,它不会产生 30 并声明缓冲区 32 个项目。堆栈有足够的空间容纳这几个额外的字节,你甚至没有初始化它,所以没有性能损失,风险也更小。