Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Pascal: Delphi 2009 ja Setup API

sterna [12.01.2011 17:05:43]

#

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.

sterna [13.01.2011 22:54:58]

#

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;

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta