COMポートオープン (CreateFile) でのエラー

解決


TC  2009-04-09 20:34:27  No: 69948

お世話になります。

環境  Windows2000 SP4 / Visual C++ 6.0 SP6 / MFC MDI

有効な COM ポートのチェックを行うのに CreateFile() を使用しているのですが、COM10 以降の指定で全て INVALID_HANDLE_VALUE が返されます。
COM10 以降の指定で何か制限があるのでしょうか?
デバイスマネージャやハイパーターミナル(アクセサリ)では問題なく認識・通信できております。
今回実行している環境は WindowsXP Home SP3 です。
下記がテストサンプルです。

void CxxView::Onxxx() 
{
CString     tp, str;
int         i;
HANDLE      hand;
COMMPROP    comm;
DCB         dcb;

str  = _T("");
for(i=1;i<30;i++)
{
    tp.Format("COM%d", i);
    hand = CreateFile(tp, GENERIC_READ | GENERIC_WRITE,
                      0, NULL, OPEN_EXISTING,
                      FILE_ATTRIBUTE_NORMAL, NULL);
    if(hand != INVALID_HANDLE_VALUE)
    {
        if(GetCommProperties(hand, &comm) && GetCommState(hand, &dcb))
            str += tp + "\n";
        else
            str += tp + " - error\n";
        CloseHandle(hand);
    }
    else    str += tp + " - FALSE\n";
}
AfxMessageBox(str);
}

よろしくご教授お願い致します。


tetrapod  2009-04-09 20:44:54  No: 69949

COM10 でぐぐってみたら即ヒットすると思うのだが・・・


オショウ  2009-04-09 21:04:36  No: 69950

COM10 CreateFile で検索したら
一番先頭がこれ・・・

http://support.microsoft.com/kb/115831/ja

ダメ元でも、まずは検索してみましょう!〜

以上。


TC  2009-04-09 21:50:02  No: 69951

tetrapodさん、オショウさん ありがとうございます。

昨日1日ググっていたんですてど、COM10 検索キーに入ってなかったです。
確かに COM10 で一発です。

お騒がせしました。これから見にいきます。

本当にありがとうございました。


tetrapod  2009-04-09 23:05:54  No: 69952

解決したっつーことで、俺ならこうするってのを例示しておこう。

tp.Format("COM%d", i); を tp.Format(_T("\\\\.\\COM%d"), i); とする
COM1 から COM255 まですべてこの変更でOK

なんかさー CString 使ってるのにそこらじゅうに "..." って書いてあるの、なんとかしない?
それに他プログラムが既に使用済みだとその COMx はエラー扱いになるわけで、
正確に(使用済みポートも)列挙するのであれば WMI を使う必要がありそうな気のせいがする。
# 今この瞬間に使用可能なポート、っつー意味だとこっちのほうが正確だけど・・・


TC  2009-04-10 00:17:17  No: 69953

tetrapodさん、お手数かけます。

確認する前に解決押しちゃいました。すいません。
予想通り(?) tp.Format("\\\\.\\COM%d", i); にしてました。
> tp.Format("COM%d", i); を tp.Format(_T("\\\\.\\COM%d"), i); とする
が正解なのですね。
_T("") と WMI ググって見てきました。WMI は使えるまでに時間がかかりそうですが、今以上にドライバ関連の情報が取れる気もするので後ほどトライします。

> # 今この瞬間に使用可能なポート、っつー意味だとこっちのほうが正確だけど・・・
本番のプログラムの目的はそうなのですが、検知しても実際には使えないCOMポート(特にノートPC等で多い)の判断が出来ずにいる状態です。
WMI 関連で何かお得な情報が無いか探してみます。

> COM1 から COM255 まですべてこの変更でOK
途中(COM31-COM255)とばしてすいませんが、COM256で通信OKでした。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加