0

我正在尝试获取当前正在使用的组件列表,以便在我的 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 上崩溃了 QT 的 comports 10 及更高版本(这意味着如果我将 i<=255 更改为 i<=9 它工作正常),

有任何想法吗?

谢谢!

4

1 回答 1

1

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

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

于 2012-06-25T06:59:15.420 回答