Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Список 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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо