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

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

Как найти USB устройство?


Kolan ©   (2006-09-22 22:21:00) 

Здравствуйте,
 Есть устройство, которое подключается через USB, но определяется системой как COM порт. (Например: Serial USB COM6)
Вопрос можно ли как-нибудь найти это устройство? Т.е. определить на какой COM порт оно стало?


Kolan   (2006-10-17 11:40:00) [1]

Удалено модератором
Примечание: Создание пустых сообщений


brother   (2006-10-17 07:00:00) [2]

данное подключение шибко напоминает подключение сотового...


Kolan   (2006-10-16 12:42:00) [3]

Удалено модератором
Примечание: Создание пустых сообщений


Kolan   (2006-10-14 18:37:00) [4]

Забыл сказать.
GetLastErrorговорит: Дополнительные данные отсутствуют


Kolan   (2006-10-14 18:33:00) [5]


> В хелпе от BDS2006 такого нет:( хотя Setup Api имеется..
> .
>

Тьфу есть же MSDN.com :)
Но вопрос остался почему не сбывается...


Kolan   (2006-10-14 18:24:00) [6]

if SetupDiEnumDeviceInfo(hAllDevices, dwInfo, Data) then
не сбывается. Устр-во подключено

Кстати а если я знаю что у меня FTDI?Может можно через их драйвер.

SetupDiEnumDeviceInfo
В хелпе от BDS2006 такого нет:( хотя Setup Api имеется...


Kolan   (2006-10-05 22:55:00) [7]

Ух. Буду разбирать...


Rouse_   (2006-10-05 15:26:00) [8]

вот так вытащить список устройств:

const
 DIGCF_ALLCLASSES=$00000004;
 DIGCF_PRESENT=$00000002;
 DIGCF_PROFILE=$00000008;
 DIGCF_DEVICEINTERFACE=$00000010;
 SPDRP_DEVICEDESC=$00000000;

type
 SP_DEVINFO_DATA=record
  cbSize:DWord;
  ClassGuid:TGuid;
  DevInst:DWord;    // DEVINST handle
  Reserved:LongInt;
 end;

 PSP_DEVINFO_DATA = ^SP_DEVINFO_DATA;
 PGuid = ^TGuid;
 H_DEV = Pointer;

function SetupDiCreateDeviceInfoList(ClassGuid:PGuid;
hwndParent:cardinal):Pointer; stdcall; external 'setupapi.dll';
function SetupDiGetClassDevsExA(ClassGuid:PGuid; Enumerator:PChar;
hwndParent:cardinal; Flags:DWord; DeviceInfoSet:Pointer;
MachineName:PChar; Reserved:DWord):Pointer; stdcall; external 'setupapi.dll';
function SetupDiGetClassDevsA(ClassGuid:PGuid; Enumerator:PChar;
hwndParent:cardinal; Flags:DWord):Pointer; stdcall; external 'setupapi.dll';
function SetupDiGetDeviceRegistryPropertyA(DeviceInfoSet:Pointer;
DeviceInfoData:PSP_DEVINFO_DATA; Property_:DWord; PropertyRegDataType:Pointer;
PropertyBuffer:Pointer; PropertyBufferSize:cardinal; RequiredSize:Pointer):longbool;
stdcall; external 'setupapi.dll';
function SetupDiEnumDeviceInfo(DeviceInfoSet:Pointer; MemberIndex:DWord;
var DeviceInfoData:SP_DEVINFO_DATA):longbool; stdcall; external 'setupapi.dll';
function SetupDiDestroyDeviceInfoList(DeviceInfoSet:Pointer):longbool; stdcall;
external 'setupapi.dll';

function GetDevices: String;
var
 dwRequired: DWORD;
 hAllDevices: H_DEV;
 dwInfo: DWORD;
 Data: SP_DEVINFO_DATA;
 Buff: array [0..99] of Char;
begin
 Result := '';
 DWORD(hAllDevices) := INVALID_HANDLE_VALUE;
 try
   hAllDevices := SetupDiGetClassDevsA(nil, nil, 0,
     DIGCF_PRESENT or DIGCF_ALLCLASSES);
   if DWORD(hAllDevices) <> INVALID_HANDLE_VALUE then
   begin
     FillChar(Data, SizeOf(SP_DEVINFO_DATA), 0);
     Data.cbSize := SizeOf(SP_DEVINFO_DATA);
     dwInfo := 0;
     if SetupDiEnumDeviceInfo(hAllDevices, dwInfo, Data) then
     begin
       Result := '';
       while SetupDiEnumDeviceInfo(hAllDevices, dwInfo, Data) do
       begin
         dwRequired := 0;
         FillChar(Buff[0], 100, #0);
         if SetupDiGetDeviceRegistryPropertyA(hAllDevices, @Data,
           SPDRP_DEVICEDESC, nil, @Buff[0], 100, @dwRequired) then
             Result := Result + (String(Buff));
         Inc(dwInfo);
       end;
     end;
   end;
   {$I crypt_end.inc}
 finally
   if DWORD(hAllDevices) <> INVALID_HANDLE_VALUE then
     SetupDiDestroyDeviceInfoList(hAllDevices);
 end;
end;


Вот так получить список только определенного типа:

procedure TForm1.Button2Click(Sender: TObject);
var
 dwRequired: DWORD;
 hDev, hAllDevices: H_DEV;
 dwInfo: DWORD;
 Data: SP_DEVINFO_DATA;
 Buff: array [0..99] of Char;
 Guid: TGUID;
begin
 Guid := StringToGUID('{C29CC2E3-BC48-4B74-9043-2C6413FFA784}');
 hDev := SetupDiCreateDeviceInfoList(@Guid, 0);
 if DWORD(hDev) <> INVALID_HANDLE_VALUE then
 try
   hAllDevices :=  SetupDiGetClassDevsExA(nil, nil, 0,
     DIGCF_PRESENT or DIGCF_ALLCLASSES, hDev, nil, 0);
   if DWORD(hAllDevices) <> INVALID_HANDLE_VALUE then
   try
     FillChar(Data, SizeOf(SP_DEVINFO_DATA), 0);
     Data.cbSize := SizeOf(SP_DEVINFO_DATA);
     dwInfo := 0;
     if SetupDiEnumDeviceInfo(hAllDevices, dwInfo, Data) then
     begin
       while SetupDiEnumDeviceInfo(hAllDevices, dwInfo, Data) do
       begin
         dwRequired := 0;
         FillChar(Buff[0], 100, #0);
         if SetupDiGetDeviceRegistryPropertyA(hAllDevices, @Data,
           SPDRP_DEVICEDESC, nil, @Buff[0], 100, @dwRequired) then
           Memo1.Lines.Add(String(Buff));
         Inc(dwInfo);
       end;
     end;
   finally
     SetupDiDestroyDeviceInfoList(hAllDevices);
   end;
 finally
   SetupDiDestroyDeviceInfoList(hDev);
 end;
end;


Kolan   (2006-10-05 13:16:00) [9]


> Через SetupAPI пробовал?
>

Так куда смотреть в спраке по Setup API?


Kolan   (2006-09-24 21:31:00) [10]


> Через SetupAPI пробовал?
>

А более точный намек? Там много всего...


Kolan   (2006-09-24 21:28:00) [11]


> Rouse_ ©   (24.09.06 17:08) [1]

Нет. Почитаю... Благодарю.


Орион   (2006-09-24 17:33:00) [12]

> [2] Ketmar ©   (24.09.06 17:17)

что бы UNsetup API не делать :)))
сорь за оффтоп.


Ketmar   (2006-09-24 17:17:00) [13]

маленький оффтоп: давно уже интересно, почему setup API заведует столь многим, что в сетапе нафиг не надо? %-)


Rouse_   (2006-09-24 17:08:00) [14]

Через SetupAPI пробовал?


Наверх

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