Вверх ↑
Ответов: 346
Рейтинг: 28
#1: 2021-09-25 17:08:40 ЛС | профиль | цитата
Приветствую всех.
В системе одновременно бывает подключено два или три аппарата, компонент Перечисление 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 за это ему ОГРОМНОЕ СПАСИБО
карма: 2
0
Редактировалось 6 раз(а), последний 2022-12-26 18:27:32