Я совсем иначе искал USB принтеры.
// TStringDictionary = class(TDictionary<String, String>);
unit Utils.USB;
interface
uses SysUtils, Windows, Classes, Cfg, CfgMgr32, SetupApi, Dialogs, Utils.Common;
const
GUID_DEVINTERFACE_USBPRINT:TGuid = '{28d78fad-5a12-11d1-ae5b-0000f803a8c2}';
SPDRP_ADDRESS = $0000001C;
procedure GetUSBPrinterList(DeviceList:TStringDictionary);
implementation
procedure GetUSBPrinterList(DeviceList:TStringDictionary);
var
devH :HDEVINFO;
devCount :DWORD;
interfaceGuid:TGuid;
devInfo:SP_DEVINFO_DATA;
devInterface: SP_DEVICE_INTERFACE_DATA;
interfaceDetail:PSPDEVICEINTERFACEDETAILDATA;
DevInst:Cardinal;
Device:String;
Description:String;
cbSize:DWORD;
Stub:Cardinal;
pDevice:PChar;
pDeviceName:PChar;
dataType:Cardinal;
begin
LoadSetupApi;
LoadConfigManagerApi;
Stub := 0;
interfaceGuid := GUID_DEVINTERFACE_USBPRINT;
devH := SetupDiGetClassDevs(@interfaceGuid, nil, 0, DIGCF_PRESENT or DIGCF_DEVICEINTERFACE);
if THandle(devH) = INVALID_HANDLE_VALUE then RaiseLastOSError;
try
devCount := 0;
devInterface.cbSize := SizeOf( SP_DEVICE_INTERFACE_DATA );
DeviceList.Clear;
while SetupDiEnumDeviceInterfaces(devH, nil, interfaceGuid, devCount, devInterface) do
begin
Inc(devCount);
cbSize := 0;
if not SetupDiGetDeviceInterfaceDetail(devH, @devInterface, nil, 0, cbSize, nil) and
( GetLastError <> ERROR_INSUFFICIENT_BUFFER ) then RaiseLastOSError;
devinfo.cbSize := SizeOf(SP_DEVINFO_DATA);
GetMem(interfaceDetail, cbSize * 1 );
interfaceDetail.cbSize := SizeOf(TSPDeviceInterfaceDetailData);
try
if not SetupDiGetDeviceInterfaceDetail(devH, @devInterface, interfaceDetail, cbSize , Stub, @devInfo)
and ( GetLastError <> ERROR_INSUFFICIENT_BUFFER ) then RaiseLastOSError;
//узнали имя устройства
pDevice := @interfaceDetail.DevicePath;
Device := pDevice;
//найдём собсно принтер - дочернее устройство
DevInst := devinfo.DevInst;
pDeviceName := nil;
if CM_Get_Child(DevInst, DevInst, 0 ) = CR_SUCCESS then
begin
try
CM_Get_DevNode_Registry_Property(DevInst, CM_DRP_DEVICEDESC, nil, nil, cbSize, 0 );
GetMem(pDeviceName, cbSize);
if CM_Get_DevNode_Registry_Property(DevInst, CM_DRP_DEVICEDESC, @dataType, pDeviceName, cbSize, 0 ) = CR_SUCCESS then
Description := pDeviceName;
finally
FreeMem(pDeviceName);
end;
end;
DeviceList.Add(Device, Description);
finally
FreeMem(interfaceDetail);
end;
end;
finally
SetupDiDestroyDeviceInfoList(devH);
end;
end;
end.