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
Der schöne Günther

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

AW: EnumPrinterDrivers = Zugriffsverletzung (Anfängerfrage)

  Alt 3. Mär 2017, 19:47
PS: Bei SetLength sollte man natürlich die Anzahl der Records und nicht der Bytes reingeben.
Ja, das ist oben in den beiden Quelltexten noch völlig falsch
  Mit Zitat antworten Zitat
Andreas2k

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

AW: EnumPrinterDrivers = Zugriffsverletzung (Anfängerfrage)

  Alt 6. Mär 2017, 12:59
PS: Bei SetLength sollte man natürlich die Anzahl der Records und nicht der Bytes reingeben.
Ja, das ist oben in den beiden Quelltexten noch völlig falsch
Das hatte mich anfangs auch gewundert aber der erste aufruf liefert ja nur die benötigten Bytes zurück und nicht die Anzahl Einträge. pcReturned liefert nach dem ersten Aufruf 0 zurück.

Mache ich also ein SetLength(arDriverList, pcReturned);

kommt beim zweiten / finalen aufruf die Fehlermeldung

Zitat:
Der angegebene Benutzerpuffer ist für den angeforderten Vorgang nicht zulässig.
Das war auch der Grund weshalb ich irtümlich Getmem benutzt habe. Ich bekomme einfach nicht die Anz Einträge bis ich eine Buffer übergebe der groß genug ist - sprich pcbNeeded
Andreas
  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, 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
 
#4

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
 
#5

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
 
#6

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.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

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
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 17:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz