Comport Listeleme Setupapi DLL Fonksiyon uniti
unit ComportUtility;
interface
uses
Windows, Messages, SysUtils;
type
THDEVINFO = Pointer;
PSP_DevInfo_Data = ^TSP_DevInfo_Data;
SP_DEVINFO_DATA = packed record
cbSize: DWORD;
ClassGuid: TGUID;
DevInst: DWORD; // DEVINST handle
Reserved: LongWord;
end;
TSP_DevInfo_Data = SP_DEVINFO_DATA;
PDEVPROPKEY = ^TDEVPROPKEY;
DEVPROPKEY = packed record
fmtid : TGUID ;
pid : Pointer;
end;
TDEVPROPKEY = DEVPROPKEY;
DEVPROPTYPE = Pointer;
PCWSTR = PWCHAR;
TDEVINST = DWord;
TPOSVERSIONINFOW = ^TOSVERSIONINFOW;
TOSVERSIONINFOW = packed record
dwOSVersionInfoSize : DWORD ;
dwMajorVersion : DWORD ;
dwMinorVersion : DWORD ;
dwBuildNumber : DWORD ;
dwPlatformId : DWORD ;
szCSDVersion : array[0..127] of wchar;
end;
TComportsName = array of string;
const
DIGCF_PRESENT = $00000002;
DIGCF_ALLCLASSES = $00000004;
DIGCF_PROFILE = $00000008;
DIGCF_DEVICEINTERFACE = $00000010;
INVALID_HANDLE_VALUE = DWORD($FFFFFFFF);
MAX_DEVICE_ID_LEN = 200;
SPDRP_DEVICEDESC = ($00000000) ;
SPDRP_FRIENDLYNAME = ($0000000C);
DEVPKEY_Device_BusReportedDeviceDesc : TDEVPROPKEY = (fmtid : '{540b947e-8b40-45bc-a8a2-6a0b894cbda2}' ; pid : pointer(4) );
function GetAvailableComports : TComportsName;
function SetupDiGetDeviceProperty(DeviceInfoSet: THDEVINFO; DeviceInfoData: PSP_DEVINFO_DATA; const PropertyKey: PDEVPROPKEY; var PropertyTypeEVPROPTYPE; PropertyBufferBYTE;PropertyBufferSizeWORD; RequiredSizeDWORD; FlagsWORD): BOOL; stdcall; external 'Setupapi.DLL' name 'SetupDiGetDevicePropertyW';
function SetupDiGetClassDevsW(const ClassGuid: PGUID; Enumerator: PCWSTR; hwndParent: HWND; Flags: DWORD): THDEVINFO; stdcall; external 'Setupapi.DLL' name 'SetupDiGetClassDevsW';
function SetupDiEnumDeviceInfo(DeviceInfoSet: THDEVINFO; MemberIndex: DWORD; DeviceInfoData: PSP_DEVINFO_DATA): BOOL; stdcall; external 'Setupapi.DLL' name 'SetupDiEnumDeviceInfo';
function SetupDiGetDeviceRegistryPropertyW(DeviceInfoSet: THDEVINFO; const DeviceInfoData: SP_DevInfo_Data; Property_: DWORD; var PropertyRegDataType: DWORD; PropertyBuffer: PBYTE; PropertyBufferSize: DWORD; var RequiredSize: DWORD): BOOL; stdcall; external 'Setupapi.DLL' name 'SetupDiGetDeviceRegistryPropertyW';
implementation
function GetAvailableComports : TComportsName;
var
GUID_CAM : TGUID;
hDevInfo : THDEVINFO;
DeviceInfoData : TSP_DEVINFO_DATA;
i : DWORD;
dwSize, dwPropertyRegDataType : DWORD;
szDesc : array[0..1023] of char;
IsOk : BOOL;
begin
SetLength(Result, 1);
GUID_CAM := StringToGUID('{4D36E978-E325-11CE-BFC1-08002BE10318}');
hDevInfo := SetupDiGetClassDevsW (@GUID_CAM, nil, 0, DIGCF_PRESENT);
if DWORD(hDevInfo) <> INVALID_HANDLE_VALUE then
begin
i := 0;
repeat
DeviceInfoData.cbSize := SizeOf(DeviceInfoData);
IsOk := SetupDiEnumDeviceInfo(hDevInfo, i, @DeviceInfoData);
if IsOk then
begin
if (SetupDiGetDeviceRegistryPropertyW (hDevInfo, DeviceInfoData, SPDRP_FRIENDLYNAME, dwPropertyRegDataType, @szDesc, sizeof(szDesc), dwSize)) then
begin
Result[i] := WideCharToString(@szDesc);
SetLength(Result, Length(Result)+1);
end;
end;
Inc(i);
until not IsOk;
end
else
begin
Result := nil;
end;
end;
end.
Combobox Mevcut Portları listeleme isim ile
procedure LoadComports;
var
i: Integer;
ports: TComportsName;
begin
cbb1.Clear;
ports := GetAvailableComports;
for i := 0 to Length(ports) - 1 do
if ports[i] <> '' then
cbb1.Items.Add(ports[i]);
cbb1.ItemIndex := 0;
end;
LoadComports;