2012-06-25 32 views
0

我想获得当前正在使用它们在我的GUI呈现它们的列表。 我使用下面的代码:阅读comport与QT通过winapi

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及更高版本(这意味着如果我< = 255改变我对我< = 9它工作正常),

任何想法?

谢谢!

回答

1

你在缓冲区中有8个ws,你正在为COM10和上面写10个字符,COM11和上面写11个字符。使缓冲区至少有11个单位。

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

+0

谢谢,但不是它7,我的意思是每个\\实际上是一个\在字符串中(它确实工作,但是...) – BioSP

+0

%d扩展为两个字符i> = 10,三个字符对于i> = 100。使用调试器,如果您不确定,请亲自查看。 –

+0

@HelloWorld:我知道如何计算“\\”。但它是11:2 \,1'.',1 \,3个字母'COM'(这使得7个字符前缀),从%d的3位数字(您的最高数字是255),非常重要**终止0 ** 。这是11个字符。 –