AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi EnumPrinterDrivers = Zugriffsverletzung (Anfängerfrage)
Thema durchsuchen
Ansicht
Themen-Optionen

EnumPrinterDrivers = Zugriffsverletzung (Anfängerfrage)

Ein Thema von Andreas2k · begonnen am 3. Mär 2017 · letzter Beitrag vom 14. Mär 2017
Antwort Antwort
Andreas2k

Registriert seit: 2. Jan 2003
108 Beiträge
 
Delphi XE5 Professional
 
#1

AW: EnumPrinterDrivers = Zugriffsverletzung (Anfängerfrage)

  Alt 10. Mär 2017, 14:16
ich bin bisher immer noch nicht schlauer.

Der erste aufruf
EnumPrinterDrivers(nil, nil, 2, nil, 0, pcbNeeded, pcReturned) liefert mir nur die benötigte größe in Byte - in meinem Fall sind das 10112 Byte (18 Treiber sind installiert)

mit SetLength(arDriverList, pcbNeeded); wird der Array 10112 Einträge groß - aber alles funktioniert.


Wie kann ich anhand der zurückgelieferten Bytes die Anzahl der Array Einträge ermitteln, die ich für ein SetLength benötige?


Oder kann ich dem Array of auch sagen das dieses insgesamt 10112 Bytes groß sein soll?
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: EnumPrinterDrivers = Zugriffsverletzung (Anfängerfrage)

  Alt 10. Mär 2017, 14:47
Wie kann ich anhand der zurückgelieferten Bytes die Anzahl der Array Einträge ermitteln, die ich für ein SetLength benötige?
Das kommt drauf an. Werden neben den DRIVER_INFO_2 Strukturen zusätzlich auch die Strings (die in den einzelnen Einträgen per Pointer referenziert werden) oder andere Sachen im Buffer abgelegt?

Nein:
Einfach die Anzahl der Bytes durch SizeOf(TDriverInfo2) teilen.

Ja:
In diesem Falle würde ich von Anfang an mit einem untypisiertem Buffer (GetMem ) arbeiten. In pcReturned gibt die API dir die Anzahl der Elemente zurück, also kannst du einfach iterieren:
Delphi-Quellcode:
var
  Buf: PDriverInfo2;
  ..
begin
  // Größe ermitteln, etc ..
  GetMem(Buf, pcbNeeded);
  try
    if EnumPrinterDrivers(...) then
    begin
      for I := 1 to pcReturned do
      begin
        // Mach was
        // ..
        // zum nächsten Element springen
        Inc(Buf);
      end;
    end;
  finally
    FreeMem(Buf);
  end;
end;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Andreas2k

Registriert seit: 2. Jan 2003
108 Beiträge
 
Delphi XE5 Professional
 
#3

AW: EnumPrinterDrivers = Zugriffsverletzung (Anfängerfrage)

  Alt 10. Mär 2017, 15:27
SizeOf(TDriverInfo2);

Hatte ich auch schon probiert ergibt bei mir aber 24 byte

pcbNeeded / 24 ergibt aber ( 10112 / 24 = 421 ) obwohl es halt nur 18 Treiber sind. Funktioniert also auch net.

Da ich bei mir ja weiß das ich 18 Treiber installiert habe ergibt sich bei mir ein Teiler von 10112 / 18 = 561 aber der Wert ist nicht überall gleich auf nem anderen Rechner muss der z.B. 429 sein.

Das andere mit GetMem muss ich mir nochmal in Ruhe anschauen..
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: EnumPrinterDrivers = Zugriffsverletzung (Anfängerfrage)

  Alt 10. Mär 2017, 15:42
Ok, das bestätigt dann auf jeden Fall meine Vermutung, dass im Buffer auch noch die dazugehörigen Strings abgelegt werden und nicht nur die DRIVER_INFO_2 Strukturen. Mit dem GetMem Beispiel sollte es aber funktionieren. Zur Erklärung:
Buf ist hier als Zeiger deklariert, welcher nach dem Aufruf der API dann auf die erste DRIVER_INFO_2 Struktur zeigt. Mit dem Inc wird der Zeiger um SizeOf(TDriverInfo2) erhöht, zeigt also danach auf das 2./3./n-te Element.

Hier fällt mir grade auf, dass in meinem Beisüiel das FreeMem am Ende so natürlich nicht funktioniert, da sich der Zeiger ja geändert hat. Den initialen Buffer-Pointer (direkt nach dem GetMem Aufruf) müsstest du dir also sichern, bevor du anfängst zu iterieren.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.114 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: EnumPrinterDrivers = Zugriffsverletzung (Anfängerfrage)

  Alt 10. Mär 2017, 16:30
Vermutung, dass im Buffer auch noch die dazugehörigen Strings abgelegt werden
Wow, das ist aber echt fies. Das erklärt die Rückgabewerte wieviel BYTES man den Puffer bitte groß machen soll. Ich glaube das ist definitiv keine Anfängerfrage mehr

Dann war mein Geschwafel ("kein Puffer, nimm einfach ein Array") definitiv falsch.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.247 Beiträge
 
Delphi 12 Athens
 
#6

AW: EnumPrinterDrivers = Zugriffsverletzung (Anfängerfrage)

  Alt 11. Mär 2017, 06:59
Man kann ja dennoch das Array verwenden, aber dann eben nicht auf alle, sondern nur auf die richige Anzahl der Einträge zugreifen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (11. Mär 2017 um 07:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: EnumPrinterDrivers = Zugriffsverletzung (Anfängerfrage)

  Alt 11. Mär 2017, 08:37
Kann man dann aber nicht so schön inkrementieren
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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