Спасибо большое.
Я натыкался уже на такой пост.
Я тут переделал под делфи 7 код, получилось следующее
Код
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ss:String;
Driver,Drivers:Cardinal;
implementation
{$R *.dfm}
const
GUID_DEVCLASS: TGUID = (D1: $36FC9E60; D2: $C465; D3: $11CF; D4: ($80, $56, $44, $45, $53, $54, $00, $00));
{36FC9E60-C465-11CF-8056-444553540000}
DIGCF_PRESENT = $00000002;
SPDRP_DEVICEDESC = $00000000;
DIGCF_DEVICEINTERFACE = $00000010;
DIGCF_DEFAULT = $00000001;
DIGCF_ALLCLASSES = $00000004;
DIGCF_PROFILE = $00000008;
type
HDEVINFO = THandle;
RETURN_TYPE = DWORD;
CONFIGRET = RETURN_TYPE;
SP_DEVINFO_DATA = packed record
cbSize: DWORD;
ClassGuid: TGUID;
DevInst: DWORD;
Reserved: DWORD;
end;
PSP_DEVINFO_DATA = ^SP_DEVINFO_DATA;
SP_DEVICE_INTERFACE_DATA= packed record
cbSize:DWORD;
InterfaceClassGuid:TGUID;
Flags:DWORD;
Reserved: DWORD;
end;
PSP_DEVICE_INTERFACE_DATA=^SP_DEVICE_INTERFACE_DATA;
SP_DEVICE_INTERFACE_DETAIL_DATA= packed record
cbSize:DWORD;
DevicePath: array of PAnsiChar
end;
PSP_DEVICE_INTERFACE_DETAIL_DATA=^SP_DEVICE_INTERFACE_DETAIL_DATA;
//==============================================================================
//подключаем библиотеки из setupapi.dll
function SetupDiGetClassDevsA(
ClassGuid: PGUID;
Enumerator: PBYTE;
hwndParent: HWND;
Flags: DWORD): HDEVINFO; stdcall; external 'SetupApi.dll';
function SetupDiEnumDeviceInfo(
DeviceInfoSet: HDEVINFO;
MemberIndex: DWORD;
DeviceInfoData: PSP_DEVINFO_DATA): boolean; stdcall; external 'SetupApi.dll';
function SetupDiDestroyDeviceInfoList(DeviceInfoSet: HDEVINFO): boolean; stdcall; external 'SetupApi.dll';
function SetupDiGetDeviceRegistryPropertyA(
DeviceInfoSet: HDEVINFO;
DeviceInfoData: PSP_DEVINFO_DATA;
Property_: DWORD;
PropertyRegDataType: PDWORD;
PropertyBuffer: PBYTE;
PropertyBufferSize: DWORD;
RequiredSize: PDWORD): BOOL; stdcall; external 'SetupApi.dll';
function SetupDiGetDeviceInterfaceDetailA(
DeviceInfoSet:HDEVINFO;
DeviceInterfaceData:PSP_DEVICE_INTERFACE_DATA;
DeviceInterfaceDetailData:PSP_DEVICE_INTERFACE_DETAIL_DATA;
DeviceInterfaceDetailDataSize:DWORD;
RequiredSize:PDWORD;
DeviceInfoData :PSP_DEVINFO_DATA): boolean; stdcall; external 'SetupApi.dll';
function SetupDiEnumDeviceInterfaces(
DeviceInfoSet: HDEVINFO;
DeviceInfoData:PSP_DEVINFO_DATA;
InterfaceClassGuid:PGUID;
MemberIndex:DWORD;
DeviceInterfaceData:PSP_DEVICE_INTERFACE_DATA
):BOOL; stdcall; external 'SetupApi.dll';
function SetupDiGetDeviceInstanceIdA(
DeviceInfoSet: HDEVINFO;
DeviceInfoData:PSP_DEVINFO_DATA;
DeviceInstanceId:PBYTE;
DeviceInstanceIdSize:DWORD;
RequiredSize:PDWORD
):BOOL; stdcall; external 'SetupApi.dll';
//=========================================================================
procedure TForm1.Button1Click(Sender: TObject);
var hDevInfoSet: HDEVINFO;
i: integer;
DevDeviceInterfaceData : SP_DEVICE_INTERFACE_DATA;
begin
hDevInfoSet:=SetupDiGetClassDevsA(@GUID_DEVCLASS,nil, 0, (DIGCF_PRESENT or DIGCF_DEVICEINTERFACE));
if (hDevInfoSet <> INVALID_HANDLE_VALUE) then
begin
DevDeviceInterfaceData.cbSize:=0;
DevDeviceInterfaceData.Flags:=0;
DevDeviceInterfaceData.Reserved:=0;
DevDeviceInterfaceData.InterfaceClassGuid.D1:=0;
DevDeviceInterfaceData.InterfaceClassGuid.D2:=0;
DevDeviceInterfaceData.InterfaceClassGuid.D3:=0;
DevDeviceInterfaceData.InterfaceClassGuid.D4[0]:=0;
DevDeviceInterfaceData.InterfaceClassGuid.D4[1]:=0;
DevDeviceInterfaceData.InterfaceClassGuid.D4[2]:=0;
DevDeviceInterfaceData.InterfaceClassGuid.D4[3]:=0;
DevDeviceInterfaceData.InterfaceClassGuid.D4[4]:=0;
DevDeviceInterfaceData.InterfaceClassGuid.D4[5]:=0;
DevDeviceInterfaceData.InterfaceClassGuid.D4[6]:=0;
DevDeviceInterfaceData.InterfaceClassGuid.D4[7]:=0;
DevDeviceInterfaceData.cbSize := sizeof(SP_DEVICE_INTERFACE_DATA);
i:=0;
while (SetupDiEnumDeviceInterfaces(hDevInfoSet,0,@GUID_DEVCLASS,i,@DevDeviceInterfaceData)) do
begin
Memo1.Lines.Add('est');
Inc(i);
end;
SetupDiDestroyDeviceInfoList(hDevInfoSet);
end;
end;
end.
На форме тупо одно мемо и одна кнопка, при нажатии на которую должен быть по идее перебор, сколько устройств с интерфейсом в системе с класом усб. Но функция SetupDiEnumDeviceInterfaces опять таки возвращает ноль. Можно также прочитать последнюю ошибку, будет сообщение, что нет с доступным интерфейсом.
Рыская по инету, наткнулся всего на ОДИН пост, где сообщалось, что GUID устройства и интерфейса - разные понятия. Но в системе этих интерфейсов зарегина куча, может есть способ узнать какой нужно подставить? Хотя во всех примерах и там и там один GUID используется.
Заглянул в инф файл драйвера
там есть строки
Class=USB
ClassGuid={36FC9E60-C465-11CF-8056-444553540000}
Да и в системе определяется в ветке усб устройств. Где ошибка тогда? Ведь не может же быть, что в системе вобще ни одного устройства с интерфесом? о_О
Самое интересное, что если делать разбор функциями SetupDiEnumDeviceInfo и SetupDiGetDeviceRegistryPropertyA
я могу получать данные HardwareID имя устройства вида "Device", еще такого вида "\Device\000011"
Вобщем эти то функции работают