delphi - Serial (COM) ports name or identification -


i've program access multiple serial ports using cport.

to configure, till listed available comports in combobox make selection, increasing number of drivers (virtual) serial interfaces makes configuring end-users troublesome.

the current detection works createfile(), has problem exists/nonexists , maybe "busy" information.

however improve, need per com port identification string, hardware device/driver (device manager) connected too. make easier user narrow comports down (since deliver finite number of serial cards)

probably available wmi, that's quite jungle, sb have more concrete information, or better, code?

(delphi xe3, win7+, no solution requires additional installing or deployment please)

if want enumerate com ports getting friendly name can use setupapi , guid_devinterface_comport device interface class.

try sample

{$apptype console}  {$r *.res}  uses   windows,   sysutils,   jvsetupapi;  const   guid_devinterface_comport:tguid='{86e0d1e0-8089-11d0-9ce4-08003e301f73}';  procedure enumeratecomports; var    cbrequired : dword;    hdev     : hdevinfo;    idev     : integer;    did      : tspdeviceinterfacedata;    pdidd    : pspdeviceinterfacedetaildata;    propertybuffer : array[0..255] of char;    deviceinfodata: tspdevinfodata;    propertyregdatatype: dword;    requiredsize: dword; begin   // enumerate com ports   hdev :=  setupdigetclassdevs(@guid_devinterface_comport, nil, 0,  digcf_present or digcf_deviceinterface);   if ( invalid_handle_value <>  thandle(hdev) )   begin     try       idev:=0;       zeromemory(@did, sizeof(did));       did.cbsize := sizeof(did);       repeat         if (setupdienumdeviceinterfaces(hdev, nil, guid_devinterface_comport, idev, did))         begin             cbrequired := 0;             setupdigetdeviceinterfacedetail(hdev, @did, nil, 0, cbrequired, nil);            if (error_insufficient_buffer= getlasterror())            begin               pdidd:=allocmem(cbrequired);               try                 pdidd.cbsize := sizeof(tspdeviceinterfacedetaildata);                 deviceinfodata.cbsize:= sizeof(deviceinfodata);                 requiredsize:=0;                 if (setupdigetdeviceinterfacedetail(hdev, @did, pdidd, cbrequired, requiredsize, @deviceinfodata))                 begin                   propertyregdatatype:=0;                  requiredsize:=0;                  if setupdigetdeviceregistryproperty(hdev, deviceinfodata, spdrp_friendlyname, propertyregdatatype,  pbyte(@propertybuffer[0]), sizeof(propertybuffer), requiredsize)                   writeln(format('friendly name - %s',[propertybuffer]));                   if setupdigetdeviceregistryproperty(hdev, deviceinfodata, spdrp_devicedesc, propertyregdatatype,  pbyte(@propertybuffer[0]), sizeof(propertybuffer), requiredsize)                   writeln(format('description   - %s',[propertybuffer]));                   if setupdigetdeviceregistryproperty(hdev, deviceinfodata, spdrp_location_information, propertyregdatatype,  pbyte(@propertybuffer[0]), sizeof(propertybuffer), requiredsize)                   writeln(format('location      - %s',[propertybuffer]));                 end                 else                 raiselastoserror;                               freemem(pdidd);               end;            end;         end         else         break;         inc(idev);       until false;           setupdidestroydeviceinfolist(hdev);     end;   end; end;  begin   try     if not loadsetupapi exit;      enumeratecomports;   except     on e: exception       writeln(e.classname, ': ', e.message);   end;   readln; end. 

this return so

enter image description here

note : jvsetupapi unit part of jvcl library.


Comments

Popular posts from this blog

node.js - Bad Request - node js ajax post -

Why does Ruby on Rails generate add a blank line to the end of a file? -

keyboard - Smiles and long press feature in Android -