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...