![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Список comm портов [D7, Win2k, WinXP]
pavel_guzhanov © (2004-05-05 10:13:00)Народ, подскажите, как определить список ком портов, доступных в системе, например заполнить номерами доступных портов комбобокс?
y-soft (2004-05-05 20:36:00) [1]Доступных - это в смысле незанятых каким-либо приложением?
Или вообще присутствующих в системе?
Можно вот так:
procedure EnumComPorts(Strings : TStrings; AvailableOnly : boolean);
var
MaxPorts : integer;
hPort : THandle;
PortNumber : integer;
PortName : string;
LastErr : DWORD;
begin
Strings.Clear;
case Win32PlatForm of
VER_PLATFORM_WIN32_NT: MaxPorts := 256;
VER_PLATFORM_WIN32_WINDOWS: MaxPorts := 50;
end;
for PortNumber := 1 to MaxPorts do
begin
if PortNumber > 9 then
PortName := '\\.\COM' + IntToStr( PortNumber ) // ask Microsoft why...
else
PortName := 'COM' + IntToStr( PortNumber );
hPort := CreateFile( PChar( PortName ),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
0,
0 );
LastErr := GetLastError;
if not (hPort = INVALID_HANDLE_VALUE) or
(not AvailableOnly and (LastErr = ERROR_ACCESS_DENIED))then
begin
{if LastErr = ERROR_ACCESS_DENIED then
PortName := PortName + ' (already in use)';}
Strings.Add( PortName );
end;
CloseHandle(hPort);
end;
end;
Jack128 (2004-05-05 10:28:00) [2]
var
Reg : TRegistry;
Names : TStrings;
i : integer;
begin
reg := TRegistry.Create(KEY_READ);
Names := TStringList.Create;
try
reg.RootKey := HKey_Local_Machine;
if reg.OpenKeyReadOnly('HARDWARE\DEVICEMAP\SerialComm') then begin
Reg.GetValueNames(Names);
for i := 0 to Names.Count - 1 do
cbCommPort.Items.Add(reg.ReadString(Names[i]));
end;
finally
Names.Free;
Reg.Free;
end;
end;