Delphi - Az elérhető nyomtatók paramétereinek lekérdezése

forráskód letöltése
A mellékelt példaprogram segítségével lekérdezhetjük, hogy milyen telepített nyomtatók érhetők el és ezek milyen paraméterekkel rendelkeznek. A paraméterekből megtudhatjuk például a nyomtató nevét, azt hogy melyik portra csatlakozik, aktuálisan hány nyomtatási munka vár elvégzésre, stb. Az adatok megszerzéséhez az EnumPrinters függvényt használhatjuk fel. Első lépésként meg kell határoznunk, hogy mekkora memória területet kell lefoglalnunk a nyomtatók adatainak tárolásához. Ehhez szintén az EnumPrinters lesz segítségünkre: ha a negyedik paramétere nil, akkor a szükséges memória terület méretét adja vissza a hatodik paraméterénél megadott változóba.

Ezt felhasználva már lefoglalhatunk a GetMem segítségével memóriát és ezek után erre a területre lekérhetjük a nyomtatók adatait.

Ha ez sikeresen megtörtént, akkor már csak egy ciklusra van szükségünk, mely végigmegy az összes elérhető nyomtató adatán. A ciklusmagban pedig megjelenítjük az adott nyomtatóhoz tartozó adatokat.
procedure TForm1.FormCreate(Sender: TObject);
var
  buffer, pi: PChar;
  flags, count, ni: DWORD;
  i: integer;
  level: byte;
begin
  flags:=PRINTER_ENUM_LOCAL;
  level:=2;
  count:=0;
  EnumPrinters(flags, nil, level, nil, 0, count, ni);
  if count>0 then begin
    GetMem(buffer, count);
    if EnumPrinters(flags, nil, level, PByte(buffer), 
         count, count, ni) then begin
      pi:=buffer;
      for i:=0 to ni-1 do begin
        with PPrinterInfo2(pi)^ do begin
          with ListView1.Items.Add do begin
            Caption:=pPrinterName;
            with SubItems do begin
              Add(pServerName);
              Add(pShareName);
              Add(pPortName);
              Add(pDriverName);
              Add(pComment);
              Add(pLocation);
              Add(IntToStr(Priority));
              Add(IntToStr(Status));
              Add(IntToStr(cJobs));
            end;
          end;
          inc(pi, sizeof(TPrinterInfo2));
        end;
      end;
    end;
    FreeMem(buffer, count);
  end;
end;