В системе одновременно бывает подключено два или три аппарата, компонент Перечисление COM-портов показывает только порт устройства (пример- COM3) но не имя и каждый раз приходится открывать диспетчер и смотреть какой порт от чего, что очень неудобно. Компонент KernelChip (параметры поиска я ему немного переделал код будет ниже) тоже ищет порты, но как надо (пример- HUAWEI Mobile Connect - Fake Acm Interface (COM3) COM3) но выдаёт все порты даже которые были подключены когда то, не понятно что подключено а что нет, да и список как туалетная бумага длинный так как подключаются разные телефоны.
Мне нужно переделать компонент KernelChip что бы в свойствах компонента был параметр показывать все устройства либо только подключённые.
Если это возможно сделать то можно будет в свойства компонента добавить ClassGUID
Переделанный KernelChip
unit hiKE_DetectDevices;
interface
uses windows,Kol,Share,Debug;
type
THIKE_DetectDevices = class(TDebug)
private
public
_event_onSearch:THI_Event;
_event_onEndSearch:THI_Event;
procedure _work_doSearch(var _Data:TData; Index:word);
end;
implementation
procedure THIKE_DetectDevices._work_doSearch;
var
hk:HKEY;
List,devs:PStrList;
i,c:smallint;
s:string;
dt,d:TData;
f:PData;
begin
hk := kol.RegKeyOpenRead(HKEY_LOCAL_MACHINE,'SYSTEM\ControlSet001\Enum\USB');
List := NewStrList;
devs := NewStrList;
kol.RegKeyGetSubKeys(hk,List);
kol.RegKeyClose(hk);
c := 0;
for i := 0 to List.Count-1 do
begin
s := 'SYSTEM\ControlSet001\Enum\USB\' + List.Items[i];
hk := kol.RegKeyOpenRead(HKEY_LOCAL_MACHINE,s);
kol.RegKeyGetSubKeys(hk,devs);
kol.RegKeyClose(hk);
hk := kol.RegKeyOpenRead(HKEY_LOCAL_MACHINE,s + '\' + devs.Items[0]);
if kol.RegKeyGetStr(hk, 'ClassGUID') = '{4d36e978-e325-11ce-bfc1-08002be10318}' then
begin
dtString(dt, kol.RegKeyGetStr(hk, 'FriendlyName'));
kol.RegKeyClose(hk);
hk := kol.RegKeyOpenRead(HKEY_LOCAL_MACHINE,s + '\' + devs.Items[0] + '\Device Parameters');
s := kol.RegKeyGetStr(hk, 'PortName');
delete(s,1,3);
dtInteger(d, str2int(s));
AddMTData(@dt, @d, f);
_hi_OnEvent(_event_onSearch, dt);
FreeData(f);
inc(c);
end
else kol.RegKeyClose(hk);
end;
List.Free;
devs.free;
_hi_OnEvent(_event_onEndSearch, c);
end;
end.
Вопрос решил Gunta за это ему ОГРОМНОЕ СПАСИБО
Редактировалось 6 раз(а), последний 2022-12-26 18:27:32