各位CB,关于串口的有关问题

各位CB高手请进,关于串口的问题。
我创建了一个ComboBox控件,然后存入COM1,COM2,COM3三个串口号。
如果计算机上COM3没有或者正在使用,我希望的是当选中COM3,立即弹出对话框报错。
  char *cComNo;
  int iComNo = 0;
  iComNo = Form1->CSerialPortNum->ItemIndex;
  iComNo = iComNo+1;
  switch(iComNo)
  {
  case 1:
  cComNo = "COM1:"; break;
  case 2:
  cComNo = "COM2:"; break;
  case 3:
  cComNo = "COM3:"; break;
  }
  hComm = CreateFile(cComNo,GENERIC_READ | GENERIC_WRITE,
  0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if(hComm == INVALID_HANDLE_VALUE) // 如果COM 未打开
  {
  MessageBox(0,"打开端口错误!","Error",MB_OK);
  }  

这个就是控件中内容改变时的代码。
现在的问题就是,当选择的次数貌似超过3次,就报错了,不管是你是不是选择的可用的串口。
怎么回事啊???新手急救~~~~~~


------解决方案--------------------
是不是打开后,没有关闭,串口不能重复打开。
------解决方案--------------------
每次打开后 需要关闭
CloseHandle(cComNo); 后才能打开

或者你在打开前进行判断一下
//判断串口是或打开
bool __stdcall IsOpen()
{
return cComNo!= INVALID_HANDLE_VALUE;
}
返回true 就说明你打开着,需要关系 才能再次打开
------解决方案--------------------
没关闭
------解决方案--------------------
请关闭了再来。
------解决方案--------------------
给段Delphi枚举系统串口的代码自己改一下咯
Delphi(Pascal) code

procedure TComSet.FormCreate(Sender: TObject); 
var R:TRegistry; 
   St:TStringList; 
   i: Integer; 
begin 
   R:=TRegistry.Create; 
   St:=TStringList.Create; 
   R.RootKey:=HKEY_LOCAL_MACHINE; 
   R.OpenKey('\Hardware\DeviceMap\SerialComm',false); 
   R.GetValueNames(St); 
   for i:=0 to St.Count-1 do 
   SelPort.Items.Add(R.ReadString(St.Strings[i])); 
   R.Free; 
   St.Free; 
end;