2012-06-25 57 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個字符。 –