Hallo Leute,
ich muss mal wieder nerven.
Bin mir jetzt nicht ganz sicher ob das nun unter
WinApi oder unter
VCL hingehört, da ja iregendwie beides
betroffen ist.
Versuche gerade die Geräte Treiber aufzulisten. Allerdings bekomme ich immer eine EA mit Zugriffsverletzung.
Hier erstmal der betroffene Code:
Delphi-Quellcode:
type
TImageBase = Array of Pointer;
TForm3 = class(TForm)
//...
private
lpImageBase: TImageBase;
CountDrivers: Integer;
//...
end;
// hier werden die Pointer der Treiber ermittelt
procedure TForm3.Button1Click(Sender: TObject);
var
lpcbNeeded: Cardinal;
success: Boolean;
begin
success := EnumDeviceDrivers(0, 0, lpcbNeeded); // einmal aufrufen um die benötigte Größe zu ermitteln
if success then
begin
CountDrivers := (lpcbNeeded div SizeOf(Pointer)); // Anzahl Treiber
SetLength(lpImageBase, CountDrivers);
success := EnumDeviceDrivers(Pointer(@lpImageBase[0]), lpcbNeeded, lpcbNeeded);
if success then
begin
AddDeviceDrivers;
end;
end;
if not success then
MessageDlg('Could not enum drivers', mtError, [mbOK], MB_OK);
end;
// Hier die Treiber dem ListView hinzufügen
procedure TForm3.AddDeviceDrivers;
var
item: TListItem;
iIndex: Integer;
name: String;
begin
for iIndex := 0 to CountDrivers - 1 do
begin
item := lvDrivers.Items.Add; // diese und die nächste Zeile machen nie Probleme
item.Caption := Format('0x%s (%s)', [IntToHex(Cardinal(lpImageBase[iIndex]), 8), IntToStr(Cardinal(lpImageBase[iIndex]))]);
name := GetDriverBaseName(lpImageBase[iIndex]);
item.SubItems.Add(name); // hier kracht es bei jedem Durchlauf
// Memo1.Lines.Add(name); // nur zum testen, hier kracht es nachdem alles durchgelaufen ist
end;
end;
// hier den Namen eines Treibers anhand des Pointers ermitteln
function TForm3.GetDriverBaseName(pImageBase: Pointer): String;
var
lpBaseName: PChar;
size: Cardinal;
begin
size := GetDeviceDriverBaseName(pImageBase, lpBaseName, MAX_PATH);
Result := StrPas(lpBaseName);
end;
Also es stehen grundsätzlich bei jedem Durchgang die richtigen Namen der Treiberdateien zur Verfügung. Hab den ganzen Bulk mehrfach debugt.
Füge ich die Namen dem ListView hinzu, kracht es bei jedem Durchgang mit einer EA. Bei dem Memo wird fleißig hinzugefügt und
beim Verlassen der "ButtonClick"-Routine kracht es ebenfalls mit einer EA.
Hoffe ich hab nix vergessen. Aber ich sehe absolut nicht wo der Fehler herkommt,
wie gesagt alle Routinen ermitteln korrekte Werte und geben auch keine Fehlschlags-Meldungen zurück. Der AufrufStack ist nicht hilfreich gewesen, ebenso wenig wie das
CPU-Fenster.
Vielleicht kann das ja mal einer Testen.
Gruß
BlackDragon
PS: Ja ich weiß, ist alles nicht besonders sauber, ist aber eben nur ein Test.