0

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);
   }

これは私のラップトップでは正常に機能しますが、何らかの理由で、comports 10以降のPCでQTがクラッシュします(つまり、i<=255をi<=9に変更すると正常に機能します)、

何か案は?

ありがとうございました!

4

1 に答える 1

1

バッファーに8つのwcharがあり、COM10以降ではszComPort10文字、COM11以降では11文字を書き込んでいます。バッファを少なくとも11ユニットにします。

編集:通常の方法は、文字を数える必要がないように、バッファを十分な傾斜で十分に大きくすることです。私はおそらく文字列を見て、それが約10文字であると思うので、フォーマットされた値に何かを使用すると、30にならず、バッファーに32項目を宣言します。スタックには、この数バイトの余分なバイトのための十分なスペースがあり、初期化すらしていないため、パフォーマンスの低下はなく、リスクも少なくなります。

于 2012-06-25T06:59:15.420 に答える