![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как найти 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 пробовал?