Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SetupApi Problem mit SetupDiGetClassDevs (https://www.delphipraxis.net/153307-setupapi-problem-mit-setupdigetclassdevs.html)

CodeX 28. Jul 2010 16:42

SetupApi Problem mit SetupDiGetClassDevs
 
Ich würde gerne folgenden Code testen (Quelle: http://www.mail-archive.com/delphi@e.../msg00605.html).

Leider erhalte ich beim Aufruf von SetupDiGetClassDevs immer einen Zugriffsfehler bei 00000000.
Die Funktion ist in SetupApi deklariert.

Bei der Recherche für die Ursache des Problems habe ich ein Posting gefunden, wo jemand empfiehlt eine ganz, ganz alte Version der SetupApi von Jedi zu nehmen, da dort das Problem nicht besteht.

Nun habe ich aber diese alte Version nicht gefunden und auch erschließt sich mir nicht, was das Problem in der normalen bzw. aktuellen Version sein könnte.

Könnte bitte jemand den Code ausprobieren und mir sagen, was das Problem sein könnte bzw. wie man das behebt?

Vielen Dank.
Delphi-Quellcode:
unit test;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SetupAPI;

const
  GUID_DEVCLASS_NET: TGUID = '{4D36E972-E325-11CE-BFC1-08002BE10318}';

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private                            
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function StateChange(NewState, SelectedItem: cardinal; hDevInfo: HDEVINFO): boolean;
var
  PropChangeParams:    SP_PROPCHANGE_PARAMS;
  DeviceInfoData:      SP_DEVINFO_DATA;
begin
  DeviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA);

  // Get handle to selected item
  if not SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, DeviceInfoData)
  then
  begin
    Result := False;
    Exit;
  end;

  // Set the PropChangeParams structure for this item
  PropChangeParams.ClassInstallHeader.InstallFunction := DIF_PROPERTYCHANGE;
  PropChangeParams.ClassInstallHeader.cbSize := SizeOf(SP_CLASSINSTALL_HEADER);
  PropChangeParams.Scope := DICS_FLAG_GLOBAL;
  PropChangeParams.StateChange := NewState;

  if not SetupDiSetClassInstallParams(hDevInfo, @DeviceInfoData,
          PSPCLASSINSTALLHEADER(@PropChangeParams), SizeOf(PropChangeParams)) then
  begin
    Result := False;
    Exit;
  end;

  // Call the ClassInstaller and perform the change
  if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, @DeviceInfoData) then
  begin
    Result := False;
    Exit;                            
  end;

  Result := True;
end;

 // ------------------------------------------------------------------------

function DisableNetAdapter: boolean;
var
  hdi: HDEVINFO;
begin
  hdi := SetupDiGetClassDevs(@GUID_DEVCLASS_NET, 0, 0, DIGCF_PRESENT);

  if cardinal(hdi) = INVALID_HANDLE_VALUE then
  begin
    Result := False;
  end
  else
  begin
    Result := StateChange(DICS_DISABLE, 0, hdi);
    SetupDiDestroyDeviceInfoList(hdi);
  end;
end;

// ------------------------------------------------------------------------

function EnableNetAdapter: boolean;
var
  hdi: HDEVINFO;
begin
  hdi := SetupDiGetClassDevs(@GUID_DEVCLASS_NET, nil, 0, DIGCF_PRESENT);

  if cardinal(hdi) = INVALID_HANDLE_VALUE then
  begin
    Result := False;
  end
  else
  begin
    Result := StateChange(DICS_ENABLE, 0, hdi);
    SetupDiDestroyDeviceInfoList(hdi);
  end;
end;

// ------------------------------------------------------------------------

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnableNetAdapter;
end;

// ------------------------------------------------------------------------


procedure TForm1.Button2Click(Sender: TObject);
begin
  DisableNetAdapter;
end;

// ------------------------------------------------------------------------

end.

Astat 28. Jul 2010 17:28

AW: SetupApi Problem mit SetupDiGetClassDevs
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi, try this.

CodeX 29. Jul 2010 00:27

AW: SetupApi Problem mit SetupDiGetClassDevs
 
Danke, das eigentliche Problem bestand wohl darin, dass ich LoadSetupAPI vorher noch ausführen muss.
Wirklich weiter bin ich damit aber nicht.

Ich müsste noch die GUID des Itnerfaces angeben, das verändert werden soll. In Deinem angehängten Projekt wird das ja irgendwie anhand der ausgelesenen Reihenfolge gemacht. Das hilft mit leider nicht sonderlich, da ich eben eine Möglichkeit brauche, ein Interface direkt mit seiner GUID anzusteuern. Da hab ich jetzt die letzten paar Stunden gesucht und experimentiert. Leider vergeblich. Kann sich das bitte jemand anschauen, und mir sagen, was ich ergänzen muss?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz