通过winapi与QT一起阅读

时间:2012-06-25 06:46:43

标签: c++ winapi

我正在尝试获取当前正在使用的组件列表,以便在我的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);
   }

这在我的笔记本电脑上工作正常,但出于某种原因,它会在我的电脑上崩溃QT 10和更高的比例(意思是如果我改变i&lt; = 255到i&lt; = 9它工作正常),

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

你在szComPort缓冲区中有8个wchars,你为COM10及以上编写10个字符,为COM11及以上编写11个字符。使缓冲区至少为11个单位。

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