unit PrnUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  WinSpool, StdCtrls, ComCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button4: TButton;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    Memo4: TMemo;
    Button1: TButton;
    TabSheet5: TTabSheet;
    Panel1: TPanel;
    procedure GetInfo1;
    procedure GetInfo2;
    procedure GetInfo5;
    procedure GetDrvInfo;
    procedure PageControl1Change(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1   : TForm1;
  hGlobal : THandle;


implementation

{$R *.DFM}

function GetPrinterName : String;
var
 Buffer : Array[0..255] of Char;
 S      : String;
begin
 GetProfileString('windows', 'device', ',,,', buffer, 256);
 S := StrPas(Buffer);
 Result :=Copy(S, 1, Pos(',', S)-1);
end;

//----------------------------------------------------------//
//  Пример использования структуры PrinterInfo1 для         //
//            получения информации о принтере               //
//----------------------------------------------------------//

procedure TForm1.GetInfo1;
var
 PI1 : PPrinterInfo1;
 dwNeeded : DWORD;
 dwCopied : DWORD;
begin
 Memo1.Lines.Clear;
// Узнаем реальный размер структуры
 EnumPrinters(PRINTER_ENUM_LOCAL, '', 1, PI1, 0, DWNEEDED, DWCOPIED);
// Выделим память
 hGlobal := GlobalAlloc(GHND, DWNEEDED);
 PI1 := PPrinterInfo1(GlobalLock(hGlobal));
// Получим информацию о принтере
 EnumPrinters(PRINTER_ENUM_LOCAL, '', 1, PI1, DWNEEDED, DWNEEDED, DWCOPIED);
// Отобразим ее
 with Memo1.Lines, PI1^ do
  begin
   Add('Description = '+ pDescription);
   Add('Name = '+ pName);
   Add('Comment = ' + pComment);
  end;
// Освободим память
 GlobalUnlock(hGlobal);
 GlobalFree(hGlobal);

end;

//----------------------------------------------------------//
//  Пример использования структуры PrinterInfo2 для         //
//            получения информации о принтере               //
//----------------------------------------------------------//

procedure TForm1.GetInfo2;
var
 PI2      : PPrinterInfo2;
 dwNeeded : DWORD;
 dwCopied : DWORD;
begin
 Memo2.Lines.Clear;
// Узнаем реальный размер структуры
 EnumPrinters(PRINTER_ENUM_LOCAL, '', 2, PI2, 0, DWNEEDED, DWCOPIED);
// Выделим память
 hGlobal := GlobalAlloc(GHND, DWNEEDED);
 PI2 := PPrinterInfo2(GlobalLock(hGlobal));
// Получим информацию о принтере
 EnumPrinters(PRINTER_ENUM_LOCAL, '', 2, PI2, DWNEEDED, DWNEEDED, DWCOPIED);
// Отобразим ее
 with Memo2.Lines, PI2^ do
  begin
   If Assigned(pServerName)  Then Add('Server Name = ' + pServerName);
   If Assigned(pPrinterName) Then Add('Printer Name = ' + pPrinterName);
   If Assigned(pShareName)   Then Add('Share Name = ' + pShareName);
   If Assigned(pPortName)    Then Add('Port Name = ' + pPortName);
   If Assigned(pDriverName)  Then Add('Driver Name = ' + pDriverName);
  // If Assigned(pComment)     Then Add('Comment = ' + pComment);
  // If Assigned(pLocation)    Then Add('Location = ' + pLocation);
  // If Assigned(pSepFile)     Then Add('SepFile = ' + pSepFile);
   If Assigned(pPrintProcessor) Then Add('Print Processor = ' + pPrintProcessor);
   If Assigned(pDatatype)    Then Add('Data Type = ' +  pDatatype);
  // If Assigned(pParameters)  Then Add('Parameters = ' + pParameters);
   with pDevMode^ do
 // Расположение на листе
    begin
      Case dmOrientation of
       1 : Add('dmOrientation = DMORIENT_PORTRAIT');
       2 : Add('dmOrientation = DMORIENT_LANDSCAPE');
      end;
    end;
  end;
// Освободим память
 GlobalUnlock(hGlobal);
 GlobalFree(hGlobal);
end;

//----------------------------------------------------------//
//  Пример использования структуры PrinterInfo5 для         //
//            получения информации о принтере               //
//----------------------------------------------------------//

procedure TForm1.GetInfo5;
var
 PI5      : PPrinterInfo5;
 dwNeeded : DWORD;
 dwCopied : DWORD;
begin
 Memo3.Lines.Clear;
// Узнаем реальный размер структуры
 EnumPrinters(PRINTER_ENUM_LOCAL, '', 5, PI5, 0, DWNEEDED, DWCOPIED);
// Выделим память
 hGlobal := GlobalAlloc(GHND, DWNEEDED);
 PI5 := PPrinterInfo5(GlobalLock(hGlobal));
// Получим информацию о принтере
 EnumPrinters(PRINTER_ENUM_LOCAL, '', 5, PI5, DWNEEDED, DWNEEDED, DWCOPIED);
// Отобразим ее
 with Memo3.Lines, PI5^ do
  begin
   Add('Printer Name = ' + pPrinterName);
   Add('Port Name = ' + pPortName);
   Add('DeviceNotSelectedTimeout = '+ IntToStr(DeviceNotSelectedTimeout) + ' ms.');
   Add('TransmissionRetryTimeout = '+ IntToStr(TransmissionRetryTimeout) + ' ms.');
  end;
// Освободим память
 GlobalUnlock(hGlobal);
 GlobalFree(hGlobal);
end;

//-------------------------------------------//
// Получение информации о драйвере принтера
//                                           //
// также можно использовать функцию GetPrinterDriver
//-------------------------------------------//
procedure TForm1.GetDrvInfo;
var
 DI       : PDriverInfo3;
 dwNeeded : DWORD;
 dwCopied : DWORD;

begin
 Memo4.Lines.Clear;
 EnumPrinterDrivers(Nil, Nil, 3, DI, 0, dwNeeded, dwCopied);
 hGlobal := GlobalAlloc(GHND, DWNEEDED);
 DI := PDriverInfo3(GlobalLock(hGlobal));
 EnumPrinterDrivers(Nil, Nil, 3, DI, dwNeeded, dwNeeded, dwCopied);
 With Memo4.Lines, DI^ do
  begin
   Add('Driver Name = ' + pName);
   Add('Environment = ' + pEnvironment);
   Add('Driver Path = ' + pDriverPath);
   Add('Data File   = ' + pDataFile);
   Add('Config File = ' + pConfigFile);
  end;
// Освободим память
 GlobalUnlock(hGlobal);
 GlobalFree(hGlobal);

end;

procedure TForm1.PageControl1Change(Sender: TObject);
begin
 Case PageControl1.ActivePage.PageIndex of
  0 : GetInfo1;
  1 : GetInfo2;
  2 : GetInfo5;
  3 : GetDrvInfo;
 end;
end;

//-----------------------------------------//
// Показать панель свойств принтера для    //
//         принтера по умолчанию           //
//-----------------------------------------//

procedure TForm1.Button4Click(Sender: TObject);
var
 hPrinter : THandle;
 PD       : TPrinterDefaults;
begin
{'SAMSUNG SI-630A ColorArt'}
 OpenPrinter(PChar(GetPrinterName), hPrinter, @PD);
 PrinterProperties(Handle, hPrinter);
 ClosePrinter(hPrinter);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Close;
end;

end.
