Einzelnen Beitrag anzeigen

Der schöne Günther

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

AW: EnumPrinterDrivers = Zugriffsverletzung (Anfängerfrage)

  Alt 3. Mär 2017, 12:33
Spar dir den Zeiger pBuffer und nimm direkt das Array:

Delphi-Quellcode:
function GetPrinterDrivers(): boolean;
var
    arDriverList : array of TDriverInfo2;
    //pBuffer : Pointer;
     pcbNeeded : DWORD;
     pcReturned : DWORD;
     ErrorTxt : array [0..500] of char;
     i : integer;
begin

// Aufruf mit Buffersize 0 soll die benötigte Größe in pcbNeeded schreiben.
// ^--------------------------------------------+
if not EnumPrinterDrivers(nil, nil, 2, nil, 0, pcbNeeded, pcReturned) then // gib ihm doch einen Nullzeiger statt einen nicht initialisierten!
    begin
      //GetMem(pBuffer, pcbNeeded);
      SetLength(arDriverList, pcbNeeded);
    end;

 result := EnumPrinterDrivers(nil, nil, 2, @arDriverList[0], pcbNeeded, pcbNeeded, pcReturned);

if result then
   begin
     //arDriverList := pBuffer; // nope
     for i := 0 to pcReturned -1 do form10.Memo1.Lines.add(arDriverList[i].pName);
      //FreeMem(pBuffer, pcbNeeded); //macht das array nach verlassen der methode selber
    end
       else
     begin
       FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, GetLastError, 0, ErrorTxt, 500, nil);
       ShowMessage(ErrorTxt);
    end
end;
Der Fehler liegt wohl daran dass du nicht einfach deinen rohen Speicherbereich von x Elementen (C-Array) in dein dynamisches Delphi-Array pressen kannst. Ein Delphi-Array enthält noch mehr Informationen (Anzahl der Elemtente, Referanzzähler). Wochenendlektüre dafür gibt es hier:
http://rvelthuis.de/articles/article...html#dynarrays

In der Regel gibst du WinAPI-Aufrufen, wenn sie einen rohen Zeiger auf einen Speicherbereich haben wollen, die Adresse deines Delphi-Arrays mit Index 0 (siehe oben: "@arDriverList[0]").


PS: Ich glaube ich habe noch nie in meinem Leben (und ich mache jetzt vier Jahre Delphi) GetMem(..)/FreeMem(..) gebraucht...

Geändert von Der schöne Günther ( 3. Mär 2017 um 12:44 Uhr)
  Mit Zitat antworten Zitat