方法一:
void Tfrmmain::enumComPorts(TStrings *Ports)
{
HKEY hKey;
int ErrCode, Index;
AnsiString ValueName, Data;
DWORD ValueLen, DataLen, ValueType;
TStringList *TmpPorts;
ErrCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "HARDWARE//DEVICEMAP//SERIALCOMM",
0, KEY_READ, &hKey);
if(ErrCode != ERROR_SUCCESS)
{
Application->MessageBoxA("Can't open the Key", SHintTitle, MB_OK);
exit(0); // raise EComPort.Create(CError_RegError, ErrCode);
}
TmpPorts = new TStringList;
try
{
Index = 0;
do
{
ValueLen = 256;
DataLen = 256;
ValueName.SetLength(ValueLen);
Data.SetLength(DataLen);
ErrCode = RegEnumValue(hKey, Index,
ValueName.c_str(), &ValueLen,
NULL, &ValueType,
Data.c_str(), &DataLen);
if (ErrCode == ERROR_SUCCESS)
{
Data.SetLength(DataLen);
TmpPorts->Add(Data);
Index ++;
}
else if (ErrCode != ERROR_NO_MORE_ITEMS)
{
Application->MessageBoxA("Can't read the Key", SHintTitle, MB_OK);
exit(0); //raise EComPort.Create(CError_RegError, ErrCode);
}
}
while (ErrCode !=ERROR_SUCCESS) ;
TmpPorts->Sort();
Ports->Assign(TmpPorts);
RegCloseKey(hKey);
delete TmpPorts;
}
catch(...)
{
RegCloseKey(hKey);
delete TmpPorts;
};
}
方法二:
void __fastcall TForm1::EnumComPorts(TStrings* aPorts)
{
TRegistry *Wreg=NULL;
TStringList *WNames=NULL;
AnsiString WSPName;
try
{
WNames = new TStringList;
Wreg = new TRegistry;
Wreg->RootKey=HKEY_LOCAL_MACHINE;
Wreg->OpenKey("HARDWARE//DEVICEMAP//SERIALCOMM",false);
Wreg->GetValueNames(WNames);
for(int i=0; i<WNames->Count; i++)
{
WSPName = Wreg->ReadString(WNames->Strings[i]);
aPorts->Add(WSPName);
}
}
__finally
{
if(Wreg) delete Wreg;
if(WNames) delete WNames;
}
}