1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
Procedure GetUnitsFromClassDevices;
{--------------------------------------------
Scanne la classe CD-Rom
****
Sources :
http://msdn.microsoft.com/library/en-us/devio/base/setupdigetclassdevs.asp
---------------------------------------------}
const
FuncName : string = 'TDriverInterfaceSPTI.GetUnitsFromClassDevices';
var
DevList : HDEVINFO; // Liste des périphériques de type CD
DevInfo : HDEVINFO;
DevI : Integer; // compteur, pour le Ieme périph de la liste
Success : Boolean;
DeviceInterfaceData: TSPDeviceInterfaceData;
DevData: TSPDevInfoData;
BytesReturned: DWORD;
FunctionClassDeviceData: PSPDeviceInterfaceDetailData;
Begin
DevInfo := SetupDiGetClassDevs(@GUID_DEVCLASS_CDROM, nil, 0, DIGCF_PRESENT);
if (DevInfo = Pointer(INVALID_HANDLE_VALUE)) then Begin
// Self.DebugAddMsg(FuncName, 'Impossible d''obtenir le handle');
Exit;
End;
{ récupère la liste des périph CD }
DevList := SetupDiGetClassDevs(@CdRomClassGuid, nil, 0, DIGCF_PRESENT or DIGCF_INTERFACEDEVICE);
if (DevList = Pointer(INVALID_HANDLE_VALUE)) then Begin
// Self.DebugAddMsg(FuncName, 'Impossible d''obtenir le handle sur la liste des cd');
Exit;
End;
{test}
DevI := 0;
Repeat
Success := GetRegistryProperty(DevInfo, DevI);
Inc(DevI, 1);
Until not Success;
End;
Function GetRegistryProperty(DevInfo : HDEVINFO; Index:DWord) : Boolean;
var
deviceInfoData : TSPDevInfoData;
errorCode : DWord;
bufferSize : DWord;
dataType : DWord;
Buffer: array[0..16383] of Char;
Status : Boolean;
BytesReturned : dword;
Begin
FillChar(deviceInfoData, SizeOf(TSPDevInfoData), #0);
deviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA);
status := SetupDiEnumDeviceInfo(DevInfo, Index, deviceInfoData);
if not Status then Begin
MessageBox(0, PChar(SysErrorMessage(GetLastError)), '', MB_OK);
exit;
End;
BytesReturned := 0;
Buffer[0] := #0;
dataType := 0;
status := SetupDiGetDeviceRegistryProperty(DevInfo, deviceInfoData, SPDRP_HARDWAREID, dataType, PBYTE(@Buffer[0]), SizeOf(Buffer), BytesReturned);
if not Status then Begin
errorCode := GetLastError;
MessageBox(0, PChar(SysErrorMessage(GetLastError)), '', MB_OK);
if errorCode = ERROR_INSUFFICIENT_BUFFER then
Result := TRUE
Else
Result := FALSE;
End;
Result := status;
End; |
Partager