由于工作的原因最近学习了一下COM接口通信
下面主要是得知那个COM口连接上了.主要通过注册表:
class PACKAGE TCommSerialPortInfo
{
public:
__property TStringList *PortList = { read = _PortList };
void __fastcall Refresh(void);
__fastcall TCommSerialPortInfo();
virtual __fastcall ~TCommSerialPortInfo();
__property bool IsFromSystem = { read = _bFromSysDrv };
static int __fastcall PortNo(AnsiString s);
static AnsiString __fastcall PortName(int iPortNo);
private:
static int __fastcall PortListSortCompare(TStringList* lpList, int Index1, int Index2);
TStringList *_PortList;
bool _bFromSysDrv;
void __fastcall ListFromSystem(void);
};
//---------------------------------------------------------------------------
/***************************************************************************/
* TCommSerialPortInfo *
/***************************************************************************/
__fastcall TCommSerialPortInfo::TCommSerialPortInfo()
{
_bFromSysDrv = false;
_PortList = new TStringList;
Refresh();
}
//---------------------------------------------------------------------------
__fastcall TCommSerialPortInfo::~TCommSerialPortInfo()
{
delete _PortList;
}
//---------------------------------------------------------------------------
void __fastcall TCommSerialPortInfo::Refresh(void)
{
_PortList->Clear();
_bFromSysDrv = false;
ListFromSystem();
if(_PortList->Count<=0)
{
for(int i=1; i<=4; i++)
_PortList->Add(PortName(i));
_bFromSysDrv = false;
}
}
//---------------------------------------------------------------------------
int __fastcall TCommSerialPortInfo::PortNo(AnsiString s)
{
if(s.SubString(1,3).UpperCase()=="COM")
{
int n = atoi(s.SubString(4,s.Length()).c_str());
if(n>0)return n;
}
return 0;
}
//---------------------------------------------------------------------------
AnsiString __fastcall TCommSerialPortInfo::PortName(int iPortNo)
{
AnsiString s;
s.sprintf("COM%d",iPortNo);
return s;
}
//---------------------------------------------------------------------------
void __fastcall TCommSerialPortInfo::ListFromSystem(void)
{
TRegistry *reg=NULL;
TStringList *names=NULL;
AnsiString sPName;
int iPortNo;
try
{
try
{
names = new TStringList;
reg = new TRegistry;
reg->RootKey=HKEY_LOCAL_MACHINE;
reg->OpenKey("HARDWARE//DEVICEMAP//SERIALCOMM",false);
reg->GetValueNames(names);
for(int i=0; i<names->Count; i++)
{
try
{
sPName = reg->ReadString(names->Strings[i]);
iPortNo = PortNo(sPName);
if(iPortNo>0)
{
_PortList->Add(PortName(iPortNo));
}
}
catch(Exception &e)
{
//ignore errors
}
}
_PortList->CustomSort(PortListSortCompare);
_bFromSysDrv = true;
}
catch(Exception &e)
{
//ignore errors
}
}
__finally
{
if(reg) delete reg;
if(names) delete names;
}
}
//---------------------------------------------------------------------------
int __fastcall TCommSerialPortInfo::PortListSortCompare(TStringList* lpList, int Index1, int Index2)
{
return PortNo(lpList->Strings[Index1]) - PortNo(lpList->Strings[Index2]);
}