Форум: "WinAPI";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];
ВнизКак найти USB устройство? Найти похожие ветки
← →
Kolan © (2006-09-22 22:21) [0]Здравствуйте,
Есть устройство, которое подключается через USB, но определяется системой как COM порт. (Например: Serial USB COM6)
Вопрос можно ли как-нибудь найти это устройство? Т.е. определить на какой COM порт оно стало?
← →
Rouse_ © (2006-09-24 17:08) [1]Через SetupAPI пробовал?
← →
Ketmar © (2006-09-24 17:17) [2]маленький оффтоп: давно уже интересно, почему setup API заведует столь многим, что в сетапе нафиг не надо? %-)
← →
Орион © (2006-09-24 17:33) [3]> [2] Ketmar © (24.09.06 17:17)
что бы UNsetup API не делать :)))
сорь за оффтоп.
← →
Kolan © (2006-09-24 21:28) [4]
> Rouse_ © (24.09.06 17:08) [1]
Нет. Почитаю... Благодарю.
← →
Kolan © (2006-09-24 21:31) [5]
> Через SetupAPI пробовал?
>
А более точный намек? Там много всего...
← →
Kolan © (2006-10-05 13:16) [6]
> Через SetupAPI пробовал?
>
Так куда смотреть в спраке по Setup API?
← →
Rouse_ © (2006-10-05 15:26) [7]вот так вытащить список устройств:
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 22:55) [8]Ух. Буду разбирать...
← →
Kolan © (2006-10-14 18:24) [9]
if SetupDiEnumDeviceInfo(hAllDevices, dwInfo, Data) then
не сбывается. Устр-во подключено
Кстати а если я знаю что у меня FTDI?Может можно через их драйвер.SetupDiEnumDeviceInfo
В хелпе от BDS2006 такого нет:( хотя Setup Api имеется...
← →
Kolan © (2006-10-14 18:33) [10]
> В хелпе от BDS2006 такого нет:( хотя Setup Api имеется..
> .
>
Тьфу есть же MSDN.com :)
Но вопрос остался почему не сбывается...
← →
Kolan © (2006-10-14 18:37) [11]Забыл сказать.
GetLastError
говорит:Дополнительные данные отсутствуют
← →
Kolan © (2006-10-16 12:42) [12]Удалено модератором
Примечание: Создание пустых сообщений
← →
brother © (2006-10-17 07:00) [13]данное подключение шибко напоминает подключение сотового...
← →
Kolan © (2006-10-17 11:40) [14]Удалено модератором
Примечание: Создание пустых сообщений
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.042 c