Форум: "WinAPI";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];
ВнизСписок Com-портов Найти похожие ветки
← →
Udaff © (2006-02-10 15:32) [0]нужно получить список установленных на компьютере Com-портов. была идея попробовать открыть каждый с 1 по 8 поочереди и в зависимости от успешности попытки делать выводы, но отпадает ибо порт может быть занят другой прогой. у кого-нить есть еще идеи ?
← →
Германн © (2006-02-10 16:00) [1]
> но отпадает ибо порт может быть занят другой прогой.
"занят другой прогой" вернет другой код ошибки нежели "отсутствует".
← →
Leonid Troyanovsky © (2006-02-10 16:52) [2]
> 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.
← →
tesseract © (2006-02-10 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]));
← →
Чапаев © (2006-02-10 20:03) [4]
> каждый с 1 по 8
Почему же по восьмой? В Windows COM-порт может иметь номер вплоть до 255. Как правильно говорит tesseract, надо из реестра читать.
← →
tesseract © (2006-02-10 22:48) [5]tesseract забыл добавить что при чтении с порта с номером больше 9 надо приписывать слева "\\.\" к имени порта. Типа "\\.\COM10".
← →
GanibalLector © (2006-02-10 23:26) [6]
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;
Взято у Паши Агурова ;)
← →
Германн © (2006-02-11 03:58) [7]
> 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;
← →
Anatoly Podgoretsky © (2006-02-11 10:23) [8]Открывай и анализируй
← →
tesseract © (2006-02-12 11:39) [9]
> Имхо, чтобы получить список действительных на сей момент
> "Com-портов" на компьютере, следует попытаться их последовательно
> открыть, проанализировать результат открытия и составить
> список исходя из попыток и ихи результатов.
Ты хочешь сказать что у тебя на наличие Com - портов "гуляет"? Тогда просто перечитай реестр.
В "HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP" содержится список всего оборудования. Он обновляется динамически.
Все "аппаратные" устройства будут и здесь :
"HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\MultifunctionAdapter\6\SerialCon troller\ число от 0 до (кол-ва портов на машине -1)".
Здесь описаны параметры ISA-устройства.
В поле "Configuration DATA" можно прочитать ресурсы занимаемые портом.
Если порт занят то просто попробуй его открыть из полученного списка.
А не перебирать все полученные значения - 255 портов ты слегка о-ь перебирать.
← →
n0name (2006-02-12 12:54) [10]
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;
← →
n0name (2006-02-12 12:56) [11]Чтоб получиться список COM-портов пробегаем от i = 0 до i = SerialCount - 1, Прот будет \\.\COM + i
← →
tesseract © (2006-02-12 14:57) [12]Угу только имей в виду что это будет работать только в NT/2k/XP. И номера com-портов могут подряд не идти.
← →
kaZaNoVa © (2006-02-12 15:03) [13]tesseract © (12.02.06 14:57) [12]
только в NT/2k/XP
а еще кто-то юзает/пишет под Вынь 9х ?))
← →
tesseract © (2006-02-12 15:21) [14]
> а еще кто-то юзает/пишет под Вынь 9х ?))
Ну например я и куча людей которые к ним аппаратуру подключают на p1/p2 знаешь ли XP подтормаживает.
← →
Anatoly Podgoretsky © (2006-02-12 15:23) [15]kaZaNoVa © (12.02.06 15:03) [13]
Хоть количество и падает, но оно еще достаточное большое. Вот на Wim 3.1 уже мало пишут.
← →
Игорь Шевченко © (2006-02-13 12:08) [16]kaZaNoVa © (12.02.06 15:03) [13]
"Просто потрепаться вы можете в соотвествующей конференции"
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c