[DUG] USB device information

Stefan Mueller muellers at orcl-toolbox.com
Thu Jul 21 16:49:11 NZST 2005


Try   GUID_CLASS_USB_DEVICE: TGUID =
'{A5DCBF10-6530-11D2-901F-00C04FB951ED}' to enumerate all USB devices, not
only the Garmin usb devices.

.. or pass DIGCF_ALLCLASSES flag to the SetupDiGetClassDevsEx function (but
then you get all device handlers, not just for usb).

Regards,
Stefan 

 

-----Original Message-----
From: delphi-bounces at ns3.123.co.nz [mailto:delphi-bounces at ns3.123.co.nz] On
Behalf Of Phil Middlemiss
Sent: Thursday, July 21, 2005 4:07 PM
To: NZ Borland Developers Group - Delphi List
Subject: Re: [DUG] USB device information

Here is some code that we use to scan for Garmin USB GPS devices. You 
will have to adapt it to your purposes, but it should give you an idea 
of the routines you need to use, and the order in which you need to use 
them:

    { scan for USB devices }
    deviceinfoset := SetupDiCreateDeviceInfoList(nil, 0);
    if (DWORD(deviceinfoset) <> INVALID_HANDLE_VALUE) then
      try
      // Retrieve the device information set for the interface class.
      guid := GUID_DEVINTERFACE_GRMNUSB;
      aguid := @GUID_DEVINTERFACE_GRMNUSB;
      newdeviceinfoset := SetupDiGetClassDevsEx(aguid, nil, 0, 
DIGCF_PRESENT or DIGCF_DEVICEINTERFACE,
        deviceinfoset, nil, nil);
      if(DWORD(newdeviceinfoset) <> INVALID_HANDLE_VALUE) then
        try
        { enumerate the devices }
        aindex := 0;
        while True do
          begin
          infodata.cbSize := SizeOf(TSPDevInfoData);
          { for each device }
          if SetupDiEnumDeviceInfo(newdeviceinfoset, aindex, infodata) then
            begin
            pinfodata := @infodata;
            bindex := 0;
            while True do
              begin
              { for each interface }
              interfacedata.cbSize := SizeOf(TSPDeviceInterfaceData);
              if SetupDiEnumDeviceInterfaces(newdeviceinfoset, 
pinfodata, guid, bindex, interfacedata) then
                begin
                pinterfacedata := @interfacedata;
                preqsize := @reqsize;
                { get the buffer size }
                if (not 
SetupDiGetDeviceInterfaceDetail(newdeviceinfoset, pinterfacedata, nil, 0,
                preqsize, nil)) and (GetLastError = 
ERROR_INSUFFICIENT_BUFFER) then
                  begin
                  { allocate the buffer }
                  pdetaildata := AllocMem(reqsize);
                  pdetaildata.cbSize := 
SizeOf(TSPDeviceInterfaceDetailData);
                  { get the details }
                    try
                    if SetupDiGetDeviceInterfaceDetail(newdeviceinfoset, 
pinterfacedata, pdetaildata, Cardinal(reqsize),
                    preqsize, pinfodata) then
                      begin
                      { check if the device has already been found }
                      apath := PChar(@pdetaildata.DevicePath);
                      alreadyfound := False;
                      for i := 0 to High(foundevices) do
                        begin
                        alreadyfound := foundevices[i].path = apath;
                        if alreadyfound then
                          begin
                          foundevices[i].found := True;
                          break;
                          end;
                        end;
                      if alreadyfound then
                        begin
                        Inc(bindex);
                        continue;
                        end;
                      { add the device }

                      <snip>

                    finally
                    FreeMem(pdetaildata);
                    end;
                  end;
                end
              else
                begin
                anerror := GetLastError;
                if anerror = ERROR_NO_MORE_ITEMS then
                  break;
                end;
              Inc(bindex);
              end;
            end
          else
            begin
            anerror := GetLastError;
            if anerror = ERROR_NO_MORE_ITEMS then
              break;
            end;
          Inc(aindex);
          end;
        finally
        SetupDiDestroyDeviceInfoList(newdeviceinfoset);
        end;
      finally
        SetupDiDestroyDeviceInfoList(deviceinfoset);
      end;

_______________________________________________
Delphi mailing list
Delphi at ns3.123.co.nz
http://ns3.123.co.nz/mailman/listinfo/delphi



More information about the Delphi mailing list