Netistä löytyi ao. koodin pätkä, jota olen yrittänyt pyörittää vistan (32) delphi2009:ssä. Aina tulee kutsun SetupDiEnumDeviceInterfaces jälkeen False ja Error 259 'No more data is available'.
Control panelista löytyy vastaavia luokkia.
Tässä muutama virherivi:
ClassName: WCEUSBS
ClassDesc: Mobile devices
LastError 259No more data is available
25DBCE51-6C8F-4A72-8A6D-B54C2B4FC835
ClassName: USB
ClassDesc: Universal Serial Bus controllers
LastError 259No more data is available
36FC9E60-C465-11CF-8056-444553540000
ClassName: Media Center Extender
ClassDesc: Media Center Extender
LastError 259No more data is available
43675D81-502A-4A82-9F84-B75F418C5DEA
...ja koodia:
var ClassGuidList: array of TGUID; ClassGUID: TGUID; RequiredSize: DWORD; ReturnString: array [0..LINE_LEN] of Char; DeviceInfoSet: HDEVINFO; DeviceInfoData: TSPDevInfoData; DeviceInterfaceData: TSPDeviceInterfaceData; DeviceInterfaceDetailData: PSPDeviceInterfaceDetailDataA; //MemberIndex: Integer; // 11.1.2011 //MemberIndex: cardinal; // 11.1.2011 MemberIndex: DWORD; // 11.1.2011 BytesReturned: DWORD; Succes: Boolean; i : Integer; LastError: LongInt; vSL: TStringList; begin vSL := TStringList.Create; LoadSetupApi; try RequiredSize := 1; SetLength(ClassGuidList, RequiredSize); SetupDiBuildClassInfoList(0,@ClassGuidList[0], (High(ClassGuidList) + 1),RequiredSize); if (High(ClassGuidList) + 1) < RequiredSize then begin SetLength(ClassGuidList, RequiredSize); SetupDiBuildClassInfoList(0, @ClassGuidList[0], (High(ClassGuidList) + 1), RequiredSize); end; for i := Low(ClassGuidList) to High(ClassGuidList) do begin ClassGUID := ClassGuidList[i]; SetupDiClassNameFromGuid(ClassGUID, ReturnString, LINE_LEN, @RequiredSize); Memo1.Lines.Add('ClassName: ' + ReturnString); SetupDiGetClassDescription(ClassGUID, ReturnString, LINE_LEN, RequiredSize); Memo1.Lines.Add('ClassDesc: ' + ReturnString); vSL.Add(ReturnString); MemberIndex := 0; DeviceInfoSet := SetupDiGetClassDevs(@ClassGUID, nil, 0, // DIGCF_PRESENT or DIGCF_DEVICEINTERFACE); DIGCF_PRESENT ); if DeviceInfoSet = Pointer(INVALID_HANDLE_VALUE) then begin Memo1.Lines.Add('DeviceInfoSet: INVALID_HANDLE_VALUE'); exit; end; repeat DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData); Succes := SetupDiEnumDeviceInterfaces(DeviceInfoSet, nil, ClassGUID, MemberIndex, DeviceInterfaceData); // ##### tässä on aina False ==> LastError 259 'No more data is available' if (not Succes) then begin LastError := GetlastError; Memo1.Lines.Add(Format('LastError %g',[int(LastError)]) + SysErrorMessage(LastError)); Memo1.Lines.Add(GUIDToStr (ClassGUID)); Memo1.Lines.Add(' '); // ShowMessage(SysErrorMessage(LastError)); end;
Mod. lisäsi kooditagit.
Otsikko on kielen osalta 'väärin'; tällä paljoakaan ole delphin kanssa tekemistä.
MemberIndex := 0; DeviceInfoSet := SetupDiGetClassDevs(@ClassGUID, nil, 0, // DIGCF_PRESENT or DIGCF_DEVICEINTERFACE); DIGCF_PRESENT ); //#### //#### ei saa olla DIGCF_PRESENT vaan DIGCF_DEVICEINTERFACE if DeviceInfoSet = Pointer(INVALID_HANDLE_VALUE) then begin Memo1.Lines.Add('DeviceInfoSet: INVALID_HANDLE_VALUE'); exit; end;
Aihe on jo aika vanha, joten et voi enää vastata siihen.