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

note : jvsetupapi unit part of jvcl library.
Comments
Post a Comment