![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Список Com-портов
Udaff © (2006-02-10 15:32:00)нужно получить список установленных на компьютере Com-портов. была идея попробовать открыть каждый с 1 по 8 поочереди и в зависимости от успешности попытки делать выводы, но отпадает ибо порт может быть занят другой прогой. у кого-нить есть еще идеи ?
Игорь Шевченко (2006-02-13 12:08:00) [1]kaZaNoVa © (12.02.06 15:03) [13]
"Просто потрепаться вы можете в соотвествующей конференции"
Anatoly Podgoretsky (2006-02-12 15:23:00) [2]kaZaNoVa © (12.02.06 15:03) [13]
Хоть количество и падает, но оно еще достаточное большое. Вот на Wim 3.1 уже мало пишут.
tesseract (2006-02-12 15:21:00) [3]
> а еще кто-то юзает/пишет под Вынь 9х ?))
Ну например я и куча людей которые к ним аппаратуру подключают на p1/p2 знаешь ли XP подтормаживает.
kaZaNoVa (2006-02-12 15:03:00) [4]tesseract © (12.02.06 14:57) [12]
только в NT/2k/XP
а еще кто-то юзает/пишет под Вынь 9х ?))
tesseract (2006-02-12 14:57:00) [5]Угу только имей в виду что это будет работать только в NT/2k/XP. И номера com-портов могут подряд не идти.
n0name (2006-02-12 12:56:00) [6]Чтоб получиться список COM-портов пробегаем от i = 0 до i = SerialCount - 1, Прот будет \\.\COM + i
n0name (2006-02-12 12:54:00) [7]
type
TSystemInformationClass=(
SystemDeviceInformation = 7
);
_SYSTEM_CONFIGURATION_INFO = packed record
DiskCount: DWORD;
FloppyCount: DWORD;
CDROMCount: DWORD;
TapeCount: DWORD;
SerialCount: DWORD;
ParallelCount: DWORD;
end;
function NtQuerySystemInformation(SystemInformationClass: TSystemInformationClass; SystemInformation: Pointer;
SystemInformationLength: DWORD; ReturnLength: PDWORD): Integer; stdcall; external 'ntdll.dll';
function GetSerialCount(): DWORD;
var
ns: Integer;
ConfInfo: _SYSTEM_CONFIGURATION_INFO;
begin
result := 0;
ns := NtQuerySystemInformation(SystemDeviceInformation, @ConfInfo, sizeof(ConfInfo), nil);
if ns <> 0 then exit;
result := ConfInfo.SerialCount;
end;
tesseract (2006-02-12 11:39:00) [8]
> Имхо, чтобы получить список действительных на сей момент
> "Com-портов" на компьютере, следует попытаться их последовательно
> открыть, проанализировать результат открытия и составить
> список исходя из попыток и ихи результатов.
Ты хочешь сказать что у тебя на наличие Com - портов "гуляет"? Тогда просто перечитай реестр.
В "HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP" содержится список всего оборудования. Он обновляется динамически.
Все "аппаратные" устройства будут и здесь :
"HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\MultifunctionAdapter\6\SerialCon troller\ число от 0 до (кол-ва портов на машине -1)".
Здесь описаны параметры ISA-устройства.
В поле "Configuration DATA" можно прочитать ресурсы занимаемые портом.
Если порт занят то просто попробуй его открыть из полученного списка.
А не перебирать все полученные значения - 255 портов ты слегка о-ь перебирать.
Anatoly Podgoretsky (2006-02-11 10:23:00) [9]Открывай и анализируй
Германн (2006-02-11 03:58:00) [10]
> tesseract © (10.02.06 17:24) [3]
>
> Так проще
>
>
> ComList:=TstringList.Create;
> reg.OpenKey('hardware\devicemap\serialcomm', false);
> ComList := TStringList.Create;
> reg.GetValueNames(ComList);
> for i:=0 to comList.Count-1 do
> ComList[i]:=(reg.ReadString(comList[i]));
>
>
Проще <> верно.
Имхо, чтобы получить список действительныхна сей момент "Com-портов" на компьютере, следует попытаться их последовательно открыть, проанализировать результат открытия и составить список исходя из попыток и ихи результатов.
Я, лично, следую пути ребят из TurboPower. Т.е. их реализации функции function IsPortAvailable(ComNum : Cardinal) : Boolean;
GanibalLector (2006-02-10 23:26:00) [11]
procedure TForm1.EnumPortClick(Sender: TObject);
var ByteNeeded,Returned,I:DWord;
Success:Boolean;
PortsPtr:Pointer;
InfoPtr:PPortInfo1;
TempStr:String;
begin
Success:=EnumPorts(nil,1,nil,0,ByteNeeded,Returned);
if (not Success) and (GetLastError=ERROR_INSUFFICIENT_BUFFER) then
begin
GetMem(PortsPtr,ByteNeeded);
try
EnumPorts(nil,1,PortsPtr,ByteNeeded,ByteNeeded,Returned);
for i:=0 to Returned-1 do
begin
InfoPtr:=PPortInfo1(DWord(PortsPtr)+I*SizeOf(TPortInfo1));
TempStr:=InfoPtr^.pName;
if Copy(TempStr,1,3)='COM' then
Memo1.Lines.Add(TempStr);
end;
finally
FreeMem(PortsPtr);
end;
end;
end;
Взято у Паши Агурова ;)
tesseract (2006-02-10 22:48:00) [12]tesseract забыл добавить что при чтении с порта с номером больше 9 надо приписывать слева '\\.\' к имени порта. Типа '\\.\COM10'.
Чапаев (2006-02-10 20:03:00) [13]
> каждый с 1 по 8
Почему же по восьмой? В Windows COM-порт может иметь номер вплоть до 255. Как правильно говорит tesseract, надо из реестра читать.
tesseract (2006-02-10 17:24:00) [14]Так проще
ComList:=TstringList.Create;
reg.OpenKey('hardware\devicemap\serialcomm', false);
ComList := TStringList.Create;
reg.GetValueNames(ComList);
for i:=0 to comList.Count-1 do
ComList[i]:=(reg.ReadString(comList[i]));
Leonid Troyanovsky (2006-02-10 16:52:00) [15]
> Udaff © (10.02.06 15:32)
> нужно получить список установленных на компьютере Com-портов.
program devlist; {$apptype console}
uses windows, sysutils;
const BufSize = 1024;
var
Buf_DevList: Array[0..BufSize] of Char;
DevName: PChar;
begin
if QueryDosDevice(nil, Buf_DevList, BufSize) = 0 then Exit;
DevName := Buf_DevList;
while DevName^ <> #00 do
begin
if (StrLIComp('COM', DevName, 3) = 0) then writeln(DevName);
DevName := StrEnd(DevName)+1;
end;
end.
--
Андрей А. Лобанов <l...@nersa.ee>
NERSA Limited
--
Regards, LVT.
Германн (2006-02-10 16:00:00) [16]
> но отпадает ибо порт может быть занят другой прогой.
"занят другой прогой" вернет другой код ошибки нежели "отсутствует".