お世話になります。
環境 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);
}
よろしくご教授お願い致します。
COM10 でぐぐってみたら即ヒットすると思うのだが・・・
COM10 CreateFile で検索したら
一番先頭がこれ・・・
http://support.microsoft.com/kb/115831/ja
ダメ元でも、まずは検索してみましょう!〜
以上。
tetrapodさん、オショウさん ありがとうございます。
昨日1日ググっていたんですてど、COM10 検索キーに入ってなかったです。
確かに COM10 で一発です。
お騒がせしました。これから見にいきます。
本当にありがとうございました。
解決したっつーことで、俺ならこうするってのを例示しておこう。
tp.Format("COM%d", i); を tp.Format(_T("\\\\.\\COM%d"), i); とする
COM1 から COM255 まですべてこの変更でOK
なんかさー CString 使ってるのにそこらじゅうに "..." って書いてあるの、なんとかしない?
それに他プログラムが既に使用済みだとその COMx はエラー扱いになるわけで、
正確に(使用済みポートも)列挙するのであれば WMI を使う必要がありそうな気のせいがする。
# 今この瞬間に使用可能なポート、っつー意味だとこっちのほうが正確だけど・・・
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でした。
ツイート | ![]() |