Hallo zusammen,
ich habe den folgende Inhalt der Procedure im I-Net gefunden und an meine Klasse angepasst :
Delphi-Quellcode:
procedure TPrinterInfo.GetAllPrinterInfos;
var
pcbNeeded : DWORD;
pcReturned : DWORD;
Buffer : PChar;
PrinterInfo: PChar;
I : Integer;
PPrinter : PPrinterInfo2;
Flags : DWORD;
Level : Byte;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
Flags := PRINTER_ENUM_CONNECTIONS or PRINTER_ENUM_LOCAL;
Level := 2;
end
else
begin
Flags := PRINTER_ENUM_LOCAL;
Level := 2;
end;
EnumPrinters(Flags, nil, Level, nil, 0, pcbNeeded, pcReturned);
GetMem(Buffer, pcbNeeded);
EnumPrinters(Flags, nil, Level, PByte(Buffer), pcbNeeded, pcbNeeded, pcReturned);
PrinterInfo := Buffer;
for I := 0 to pcReturned - 1 do
begin
New(PPrinter); // <--- Hier ist wahrscheinlich das MemoryLeak
with PPrinterInfo2(PrinterInfo)^ do
begin
PPrinter^.pServerName := pServerName;
PPrinter^.pPrinterName := pPrinterName;
PPrinter^.pShareName := pShareName;
PPrinter^.pPortName := pPortName;
PPrinter^.pDriverName := pDriverName;
PPrinter^.pComment := pComment;
PPrinter^.pLocation := pLocation;
PPrinter^.pSepFile := pSepFile;
PPrinter^.pPrintProcessor := pPrintProcessor;
PPrinter^.pDatatype := pDatatype;
PPrinter^.pParameters := pParameters;
PPrinter^.Attributes := Attributes;
PPrinter^.Priority := Priority;
PPrinter^.DefaultPriority := DefaultPriority;
PPrinter^.StartTime := StartTime;
PPrinter^.UntilTime := UntilTime;
PPrinter^.Status := Status;
PPrinter^.cJobs := cJobs;
PPrinter^.AveragePPM := AveragePPM;
FAllInfos.Add(Pointer(PPrinter));
Inc(PrinterInfo, SizeOf(TPrinterInfo2));
end;
end;
FreeMem(Buffer);
end;
FAllInfos ist nur eine TList, die im Konstruktor erstellt wird.
Die Procedure funktioniert auch wunderbar. Es gibt da nur ein kleines Problem. Wenn ich die Klasse mit Eurekalog kompiliere und ausführe, dann zeigt er mir ein MemoryLeak beim Befehl
New(PPPrinter) an. Ich habe dann unter FreeMem(Buffer) noch Dispose(PPrinter) hinzugefügt, was aber nicht hilft.
Könnte mir das Bitte jemand erklären, warum dann immer noch ein MemoryLeak angezeigt wird. Ich verstehe wahrscheinlich die Darstellung mit den Pointer nicht, trotz das ich mir schon ein paar Tutorials durchgelsen habe.