Приветствую всех.
Вот кусок рабочего кода, но
получаю инфу об устройствах на китайском, что не так посмотрите плиз.
Работаю на ХЕ4
Вот кусок кода:
Код:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
const
SetupApiModuleName = 'SETUPAPI.DLL';
type
HDEVINFO = THandle;
ULONG_PTR = ^ ULONG;
const
GUID_DEVCLASS_DISKDRIVE: TGUID = '{4D36E967-E325-11CE-BFC1-08002BE10318}';
// GUID_DEVCLASS_DISKDRIVE: TGUID = '{4D36E96F-E325-11CE-BFC1-08002BE10318}';
const
DIGCF_PRESENT = $00000002;
SPDRP_FRIENDLYNAME = $0000000C;
SPDRP_DEVICEDESC = $00000000;
type
PSPDevInfoData = ^TSPDevInfoData;
SP_DEVINFO_DATA = packed record
cbSize: DWORD;
ClassGuid: TGUID;
DevInst: DWORD; // DEVINST handle
Reserved: ULONG_PTR;
end;
TSPDevInfoData = SP_DEVINFO_DATA;
PSPDeviceInterfaceData = ^TSPDeviceInterfaceData;
SP_DEVICE_INTERFACE_DATA = packed record
cbSize: DWORD;
InterfaceClassGuid: TGUID;
Flags: DWORD;
Reserved: ULONG_PTR;
end;
TSPDeviceInterfaceData = SP_DEVICE_INTERFACE_DATA;
function SetupDiGetClassDevs(ClassGuid: PGUID; const Enumerator: PAnsiChar;
hwndParent: HWND; Flags: DWORD): HDEVINFO; stdcall; external SetupApiModuleName
name 'SetupDiGetClassDevsA';
function SetupDiEnumDeviceInfo(DeviceInfoSet: HDEVINFO; MemberIndex: DWORD;
var DeviceInfoData: TSPDevInfoData): BOOL; stdcall; external SetupApiModuleName name 'SetupDiEnumDeviceInfo';
function SetupDiGetDeviceRegistryProperty(DeviceInfoSet: HDEVINFO;
const DeviceInfoData: TSPDevInfoData; Property_: DWORD;
var PropertyRegDataType: DWORD; PropertyBuffer: PBYTE; PropertyBufferSize: DWORD;
var RequiredSize: DWORD): BOOL; stdcall; external SetupApiModuleName name 'SetupDiGetDeviceRegistryPropertyA';
function SetupDiDestroyDeviceInfoList(DeviceInfoSet: HDEVINFO): BOOL; stdcall;
external SetupApiModuleName name 'SetupDiDestroyDeviceInfoList';
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function GetDeviceName(PnPHandle: HDEVINFO; const DevData: TSPDevInfoData): string;
var
BytesReturned: DWORD;
RegDataType: DWORD;
Buffer: array [0..256] of CHAR;
begin
BytesReturned := 0;
RegDataType := 0;
Buffer[0] := #0;
SetupDiGetDeviceRegistryProperty(PnPHandle, DevData, SPDRP_FRIENDLYNAME,
RegDataType, PByte(@Buffer[0]), SizeOf(Buffer), BytesReturned);
Result := Buffer;
if Result<>'' then exit;
BytesReturned := 0;
RegDataType := 0;
Buffer[0] := #0;
SetupDiGetDeviceRegistryProperty(PnPHandle, DevData, SPDRP_DEVICEDESC,
RegDataType, PByte(@Buffer[0]), SizeOf(Buffer), BytesReturned);
Result:=Buffer;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
DrivePnPHandle: HDEVINFO;
DeviceNumber:DWORD;
DevData: TSPDevInfoData;
DeviceInterfaceData: TSPDeviceInterfaceData;
RES:BOOL;
begin
form1.ListBox1.Clear;
DrivePnPHandle := SetupDiGetClassDevs(@GUID_DEVCLASS_DISKDRIVE, nil, 0, DIGCF_PRESENT {or DIGCF_PROFILE});
if DrivePnPHandle = INVALID_HANDLE_VALUE then Exit;
DeviceNumber := 0;
repeat
DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);
DevData.cbSize := SizeOf(TSPDevInfoData);
RES := SetupDiEnumDeviceInfo(DrivePnPHandle, DeviceNumber, DevData);
if (RES) then
begin
form1.ListBox1.Items.Add(GetDeviceName(DrivePnPHandle, DevData));
Memo1.Lines.Add(GetDeviceName(DrivePnPHandle, DevData));
Inc(DeviceNumber);
end;
until not RES;
SetupDiDestroyDeviceInfoList(DrivePnPHandle);
end;
end.