Dumme Frage aber kann ich es nicht auch einfach so machen:
statt 2x EnumPrinterDrivers aufzurufen rufe ich es 3x auf (1x um die nötige Buffersize zu ermitteln, 1x mit dem pBuffer in der Größe von BytesNeeded um den ItemsCount zu erhalten, 1x der finale aufruf mit dem @array[0] (=SetLength(array, ItemsReturned))
Delphi-Quellcode:
function GetPrinterDrivers(): boolean;
var
aDriverList : array of TDriverInfo2;
pBuffer : Pointer;
BytesNeeded : DWORD;
ItemsReturned : DWORD;
ErrorTxt : array [0..500] of char;
i : integer;
begin
// BufferSize ermitteln
if not EnumPrinterDrivers(nil, nil, 2, nil, 0, BytesNeeded, ItemsReturned) then
begin
if GetLastError = ERROR_INSUFFICIENT_BUFFER then
begin
try
// pBuffer Speicher reservieren
pBuffer := System.AllocMem(BytesNeeded);
// Anz. Items des Arrays ermitteln
if EnumPrinterDrivers(nil, nil, 2, pBuffer, BytesNeeded, BytesNeeded, ItemsReturned) then
begin
// Array Länge setzen
SetLength(aDriverList, ItemsReturned);
result := EnumPrinterDrivers(nil, nil, 2, @aDriverList[0], BytesNeeded, BytesNeeded, ItemsReturned);
end;
finally
// Speicher freigeben
FreeMem(pBuffer);
end;
end;
end;
Kann man das so machen oder ist das zu gefährlich / dümmlich ?