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
[email protected]
http://ns3.123.co.nz/mailman/listinfo/delphi

Reply via email to