在程序中,由于有大量的数据需要打印,针式打印机,速度较慢,如果有打印任务时,直接把它放到打印队列中,经常出现漏打.因此,只有当打印机空闲时,才发送打印命令.
可是,现在我没法获得当前打印机的状态.在网上找过一些代码,都用到了汇编,在XP下不支持.

解决方案 »

  1.   

    试试windows的API函数吧,网上查查,看有没有相关API函数。
      

  2.   

      TPrinterInfo   =   record   
            SeverName                   :   PChar;   
            PrinterName               :   PChar;   
            ShareName                   :   PChar;   
            PortName                     :   PChar;   
            DriverName                 :   PChar;   
            Comment                       :   PChar;   
            Location                     :   PChar;   
            DeviceMode                 :   PDeviceModeA;   
            SepFile                       :   PChar;   
            PrintProcessor         :   PChar;   
            DataType                     :   PChar;   
            Parameters                 :   PChar;   
            SecurityDescriptor:   PSecurityDescriptor;   
            Attributes                 :   Cardinal;   
            DefaultPriority       :   Cardinal;   
            StartTime                   :   Cardinal;   
            UntilTime                   :   Cardinal;   
            Status                         :   Cardinal;   
            Jobs                             :   Cardinal;   
            AveragePPM                 :   Cardinal;
        end;  
    function   GetCurrentPrinterHandle:   THandle;   
    var   
        Device,   Driver,   Port   :   array[0..255]   of   char;   
        hDeviceMode:   THandle;   
    begin   
        Printer.GetPrinter(Device,   Driver,   Port,   hDeviceMode);   
        if   not   OpenPrinter(@Device,   Result,   nil)   then   
            RaiseLastWin32Error;   
    end;   function   GetCurrentPrinterInformation:   TPrinterInfo;   
    var   
        hPrinter     :   THandle;   
        pInfo:     PPrinterInfo2;   
        bytesNeeded:   DWORD;   
    begin   
        hprinter   :=   GetCurrentPrinterHandle;   
        try   
            Winspool.GetPrinter(   hPrinter,   2,   Nil,   0,   @bytesNeeded   );   
            pInfo   :=   AllocMem(   bytesNeeded   );   
            try   
                Winspool.GetPrinter(   hPrinter,   2,   pInfo,   bytesNeeded,   @bytesNeeded   );   
                  Result.SeverName                     :=   pInfo^.pServerName;   
                  Result.PrinterName                 :=   pInfo^.pPrinterName;   
                  Result.ShareName                     :=   pInfo^.pShareName;   
                  Result.PortName                       :=   pInfo^.pPortName;   
                  Result.DriverName                   :=   pInfo^.pDriverName;   
                  Result.Comment                         :=   pInfo^.pComment;   
                  Result.Location                       :=   pInfo^.pLocation;   
                  Result.DeviceMode                   :=   pInfo^.pDevMode;   
                  Result.SepFile                         :=   pInfo^.pSepFile;   
                  Result.PrintProcessor           :=   pInfo^.pPrintProcessor;   
                  Result.DataType                       :=   pInfo^.pDatatype;   
                  Result.Parameters                   :=   pInfo^.pParameters;   
                  Result.SecurityDescriptor   :=   pInfo^.pSecurityDescriptor;   
                  Result.Attributes                   :=   pInfo^.Attributes;   
                  Result.DefaultPriority         :=   pInfo^.DefaultPriority;   
                  Result.StartTime                     :=   pInfo^.StartTime;   
                  Result.UntilTime                     :=   pInfo^.UntilTime;   
                  Result.Status                           :=   pInfo^.Status;   
                  Result.Jobs                               :=   pInfo^.cJobs;   
                  Result.AveragePPM                   :=   pInfo^.AveragePPM;   
            finally   
                FreeMem(   pInfo   );   
            end;   
        finally   
            ClosePrinter(   hPrinter   );   
        end;   
    end;
    procedure TForm1.ComboBox1Change(Sender: TObject);
    var   
        PrinterInfo:   TPrinterInfo;   
    begin   
        PrinterInfo   :=   GetCurrentPrinterInformation;   
        memo1.Clear;
        with   memo1.Lines   do   
        begin   
            Add('GENERAL   INFORMATION');   
            Add('');   
            Add('ServerName:   '   +   PrinterInfo.SeverName);   
            Add('PrinterName:   '   +   PrinterInfo.PrinterName);   
            Add('ShareName:   '   +   PrinterInfo.ShareName);   
            Add('PortName:   '   +   PrinterInfo.PortName);   
            Add('DriverName:   '   +   PrinterInfo.DriverName);   
            Add('Comment:   '   +   PrinterInfo.Comment);   
            Add('Location:   '   +   PrinterInfo.Location);   
            Add('SepFile:   '   +   PrinterInfo.SepFile);   
            Add('PrintProcessor:   '   +   PrinterInfo.PrintProcessor);   
            Add('DataType:   '   +   PrinterInfo.DataType);   
            Add('Parameters:   '   +   PrinterInfo.Parameters);   
            Add('Attributes:   '   +   IntToStr(PrinterInfo.Attributes));   
            Add('DefaultPriority:   '   +   IntToStr(PrinterInfo.DefaultPriority));   
            Add('StartTime:   '   +   IntToStr(PrinterInfo.StartTime));   
            Add('UntilTime:   '   +   IntToStr(PrinterInfo.UntilTime));   
            Add('Status:   '   +   IntToStr(PrinterInfo.Status));   
            Add('Jobs:   '   +   IntToStr(PrinterInfo.Jobs));   
            Add('AveragePPM:   '   +   IntToStr(PrinterInfo.AveragePPM));   
            Add('');   
            Add('DEVICEMODE   INFORMATION');   
            Add('');           Add('DeviceName:   '   +   PrinterInfo.DeviceMode.dmDeviceName);   
            Add('SpecVersion:   '   +   IntToStr(PrinterInfo.DeviceMode.dmSpecVersion));   
            Add('DriverVersion:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDriverVersion));   
            Add('Size:   '   +   IntToStr(PrinterInfo.DeviceMode.dmSize));   
            Add('DriverExtra:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDriverExtra));   
            Add('Fields:   '   +   IntToStr(PrinterInfo.DeviceMode.dmFields));   
            Add('Orientation:   '   +   IntToStr(PrinterInfo.DeviceMode.dmOrientation));   
            Add('PaperSize:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPaperSize));   
            Add('PaperLength:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPaperLength));   
            Add('PaperWidth:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPaperWidth));   
            Add('Scale:   '   +   IntToStr(PrinterInfo.DeviceMode.dmScale));   
            Add('Copies:   '   +   IntToStr(PrinterInfo.DeviceMode.dmCopies));   
            Add('DefaultSource:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDefaultSource));   
            Add('PrintQuality:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPrintQuality));   
            Add('Color:   '   +   IntToStr(PrinterInfo.DeviceMode.dmColor));   
            Add('Duplex:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDuplex));   
            Add('YResolution:   '   +   IntToStr(PrinterInfo.DeviceMode.dmYResolution));   
            Add('TTOption:   '   +   IntToStr(PrinterInfo.DeviceMode.dmTTOption));   
            Add('Collate:   '   +   IntToStr(PrinterInfo.DeviceMode.dmCollate));   
            Add('LogPixels:   '   +   IntToStr(PrinterInfo.DeviceMode.dmLogPixels));   
            Add('BitsPerPel:   '   +   IntToStr(PrinterInfo.DeviceMode.dmBitsPerPel));   
            Add('PelsWidth:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPelsWidth));   
            Add('PelsHeight:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPelsHeight));   
            Add('DisplayFlags:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDisplayFlags));   
            Add('DisplayFrequency:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDisplayFrequency));   
      

  3.   

      TPrinterInfo   =   record   
            SeverName                   :   PChar;   
            PrinterName               :   PChar;   
            ShareName                   :   PChar;   
            PortName                     :   PChar;   
            DriverName                 :   PChar;   
            Comment                       :   PChar;   
            Location                     :   PChar;   
            DeviceMode                 :   PDeviceModeA;   
            SepFile                       :   PChar;   
            PrintProcessor         :   PChar;   
            DataType                     :   PChar;   
            Parameters                 :   PChar;   
            SecurityDescriptor:   PSecurityDescriptor;   
            Attributes                 :   Cardinal;   
            DefaultPriority       :   Cardinal;   
            StartTime                   :   Cardinal;   
            UntilTime                   :   Cardinal;   
            Status                         :   Cardinal;   
            Jobs                             :   Cardinal;   
            AveragePPM                 :   Cardinal;
        end;  
    function   GetCurrentPrinterHandle:   THandle;   
    var   
        Device,   Driver,   Port   :   array[0..255]   of   char;   
        hDeviceMode:   THandle;   
    begin   
        Printer.GetPrinter(Device,   Driver,   Port,   hDeviceMode);   
        if   not   OpenPrinter(@Device,   Result,   nil)   then   
            RaiseLastWin32Error;   
    end;   function   GetCurrentPrinterInformation:   TPrinterInfo;   
    var   
        hPrinter     :   THandle;   
        pInfo:     PPrinterInfo2;   
        bytesNeeded:   DWORD;   
    begin   
        hprinter   :=   GetCurrentPrinterHandle;   
        try   
            Winspool.GetPrinter(   hPrinter,   2,   Nil,   0,   @bytesNeeded   );   
            pInfo   :=   AllocMem(   bytesNeeded   );   
            try   
                Winspool.GetPrinter(   hPrinter,   2,   pInfo,   bytesNeeded,   @bytesNeeded   );   
                  Result.SeverName                     :=   pInfo^.pServerName;   
                  Result.PrinterName                 :=   pInfo^.pPrinterName;   
                  Result.ShareName                     :=   pInfo^.pShareName;   
                  Result.PortName                       :=   pInfo^.pPortName;   
                  Result.DriverName                   :=   pInfo^.pDriverName;   
                  Result.Comment                         :=   pInfo^.pComment;   
                  Result.Location                       :=   pInfo^.pLocation;   
                  Result.DeviceMode                   :=   pInfo^.pDevMode;   
                  Result.SepFile                         :=   pInfo^.pSepFile;   
                  Result.PrintProcessor           :=   pInfo^.pPrintProcessor;   
                  Result.DataType                       :=   pInfo^.pDatatype;   
                  Result.Parameters                   :=   pInfo^.pParameters;   
                  Result.SecurityDescriptor   :=   pInfo^.pSecurityDescriptor;   
                  Result.Attributes                   :=   pInfo^.Attributes;   
                  Result.DefaultPriority         :=   pInfo^.DefaultPriority;   
                  Result.StartTime                     :=   pInfo^.StartTime;   
                  Result.UntilTime                     :=   pInfo^.UntilTime;   
                  Result.Status                           :=   pInfo^.Status;   
                  Result.Jobs                               :=   pInfo^.cJobs;   
                  Result.AveragePPM                   :=   pInfo^.AveragePPM;   
            finally   
                FreeMem(   pInfo   );   
            end;   
        finally   
            ClosePrinter(   hPrinter   );   
        end;   
    end;
    procedure TForm1.ComboBox1Change(Sender: TObject);
    var   
        PrinterInfo:   TPrinterInfo;   
    begin   
        PrinterInfo   :=   GetCurrentPrinterInformation;   
        memo1.Clear;
        with   memo1.Lines   do   
        begin   
            Add('GENERAL   INFORMATION');   
            Add('');   
            Add('ServerName:   '   +   PrinterInfo.SeverName);   
            Add('PrinterName:   '   +   PrinterInfo.PrinterName);   
            Add('ShareName:   '   +   PrinterInfo.ShareName);   
            Add('PortName:   '   +   PrinterInfo.PortName);   
            Add('DriverName:   '   +   PrinterInfo.DriverName);   
            Add('Comment:   '   +   PrinterInfo.Comment);   
            Add('Location:   '   +   PrinterInfo.Location);   
            Add('SepFile:   '   +   PrinterInfo.SepFile);   
            Add('PrintProcessor:   '   +   PrinterInfo.PrintProcessor);   
            Add('DataType:   '   +   PrinterInfo.DataType);   
            Add('Parameters:   '   +   PrinterInfo.Parameters);   
            Add('Attributes:   '   +   IntToStr(PrinterInfo.Attributes));   
            Add('DefaultPriority:   '   +   IntToStr(PrinterInfo.DefaultPriority));   
            Add('StartTime:   '   +   IntToStr(PrinterInfo.StartTime));   
            Add('UntilTime:   '   +   IntToStr(PrinterInfo.UntilTime));   
            Add('Status:   '   +   IntToStr(PrinterInfo.Status));   
            Add('Jobs:   '   +   IntToStr(PrinterInfo.Jobs));   
            Add('AveragePPM:   '   +   IntToStr(PrinterInfo.AveragePPM));   
            Add('');   
            Add('DEVICEMODE   INFORMATION');   
            Add('');           Add('DeviceName:   '   +   PrinterInfo.DeviceMode.dmDeviceName);   
            Add('SpecVersion:   '   +   IntToStr(PrinterInfo.DeviceMode.dmSpecVersion));   
            Add('DriverVersion:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDriverVersion));   
            Add('Size:   '   +   IntToStr(PrinterInfo.DeviceMode.dmSize));   
            Add('DriverExtra:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDriverExtra));   
            Add('Fields:   '   +   IntToStr(PrinterInfo.DeviceMode.dmFields));   
            Add('Orientation:   '   +   IntToStr(PrinterInfo.DeviceMode.dmOrientation));   
            Add('PaperSize:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPaperSize));   
            Add('PaperLength:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPaperLength));   
            Add('PaperWidth:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPaperWidth));   
            Add('Scale:   '   +   IntToStr(PrinterInfo.DeviceMode.dmScale));   
            Add('Copies:   '   +   IntToStr(PrinterInfo.DeviceMode.dmCopies));   
            Add('DefaultSource:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDefaultSource));   
            Add('PrintQuality:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPrintQuality));   
            Add('Color:   '   +   IntToStr(PrinterInfo.DeviceMode.dmColor));   
            Add('Duplex:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDuplex));   
            Add('YResolution:   '   +   IntToStr(PrinterInfo.DeviceMode.dmYResolution));   
            Add('TTOption:   '   +   IntToStr(PrinterInfo.DeviceMode.dmTTOption));   
            Add('Collate:   '   +   IntToStr(PrinterInfo.DeviceMode.dmCollate));   
            Add('LogPixels:   '   +   IntToStr(PrinterInfo.DeviceMode.dmLogPixels));   
            Add('BitsPerPel:   '   +   IntToStr(PrinterInfo.DeviceMode.dmBitsPerPel));   
            Add('PelsWidth:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPelsWidth));   
            Add('PelsHeight:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPelsHeight));   
            Add('DisplayFlags:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDisplayFlags));   
            Add('DisplayFrequency:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDisplayFrequency));   
      

  4.   

    procedure TForm1.ComboBox1Change(Sender: TObject);
    var   
        PrinterInfo:   TPrinterInfo;   
    begin   
        PrinterInfo   :=   GetCurrentPrinterInformation;   
        memo1.Clear;
        with   memo1.Lines   do   
        begin   
            Add('GENERAL   INFORMATION');   
            Add('');   
            Add('ServerName:   '   +   PrinterInfo.SeverName);   
            Add('PrinterName:   '   +   PrinterInfo.PrinterName);   
            Add('ShareName:   '   +   PrinterInfo.ShareName);   
            Add('PortName:   '   +   PrinterInfo.PortName);   
            Add('DriverName:   '   +   PrinterInfo.DriverName);   
            Add('Comment:   '   +   PrinterInfo.Comment);   
            Add('Location:   '   +   PrinterInfo.Location);   
            Add('SepFile:   '   +   PrinterInfo.SepFile);   
            Add('PrintProcessor:   '   +   PrinterInfo.PrintProcessor);   
            Add('DataType:   '   +   PrinterInfo.DataType);   
            Add('Parameters:   '   +   PrinterInfo.Parameters);   
            Add('Attributes:   '   +   IntToStr(PrinterInfo.Attributes));   
            Add('DefaultPriority:   '   +   IntToStr(PrinterInfo.DefaultPriority));   
            Add('StartTime:   '   +   IntToStr(PrinterInfo.StartTime));   
            Add('UntilTime:   '   +   IntToStr(PrinterInfo.UntilTime));   
            Add('Status:   '   +   IntToStr(PrinterInfo.Status));   
            Add('Jobs:   '   +   IntToStr(PrinterInfo.Jobs));   
            Add('AveragePPM:   '   +   IntToStr(PrinterInfo.AveragePPM));   
            Add('');   
            Add('DEVICEMODE   INFORMATION');   
            Add('');           Add('DeviceName:   '   +   PrinterInfo.DeviceMode.dmDeviceName);   
            Add('SpecVersion:   '   +   IntToStr(PrinterInfo.DeviceMode.dmSpecVersion));   
            Add('DriverVersion:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDriverVersion));   
            Add('Size:   '   +   IntToStr(PrinterInfo.DeviceMode.dmSize));   
            Add('DriverExtra:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDriverExtra));   
            Add('Fields:   '   +   IntToStr(PrinterInfo.DeviceMode.dmFields));   
            Add('Orientation:   '   +   IntToStr(PrinterInfo.DeviceMode.dmOrientation));   
            Add('PaperSize:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPaperSize));   
            Add('PaperLength:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPaperLength));   
            Add('PaperWidth:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPaperWidth));   
            Add('Scale:   '   +   IntToStr(PrinterInfo.DeviceMode.dmScale));   
            Add('Copies:   '   +   IntToStr(PrinterInfo.DeviceMode.dmCopies));   
            Add('DefaultSource:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDefaultSource));   
            Add('PrintQuality:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPrintQuality));   
            Add('Color:   '   +   IntToStr(PrinterInfo.DeviceMode.dmColor));   
            Add('Duplex:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDuplex));   
            Add('YResolution:   '   +   IntToStr(PrinterInfo.DeviceMode.dmYResolution));   
            Add('TTOption:   '   +   IntToStr(PrinterInfo.DeviceMode.dmTTOption));   
            Add('Collate:   '   +   IntToStr(PrinterInfo.DeviceMode.dmCollate));   
            Add('LogPixels:   '   +   IntToStr(PrinterInfo.DeviceMode.dmLogPixels));   
            Add('BitsPerPel:   '   +   IntToStr(PrinterInfo.DeviceMode.dmBitsPerPel));   
            Add('PelsWidth:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPelsWidth));   
            Add('PelsHeight:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPelsHeight));   
            Add('DisplayFlags:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDisplayFlags));   
            Add('DisplayFrequency:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDisplayFrequency));   
            Add('ICMMethod:   '   +   IntToStr(PrinterInfo.DeviceMode.dmICMMethod));   
            Add('ICMintent:   '   +   IntToStr(PrinterInfo.DeviceMode.dmICMIntent));   
            Add('MediaType:   '   +   IntToStr(PrinterInfo.DeviceMode.dmMediaType));   
            Add('DitherType:   '   +   IntToStr(PrinterInfo.DeviceMode.dmDitherType));   
            Add('ICCManufacturer:   '   +   IntToStr(PrinterInfo.DeviceMode.dmICCManufacturer));   
            Add('ICCModel:   '   +   IntToStr(PrinterInfo.DeviceMode.dmICCModel));   
            Add('PanningWidth:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPanningWidth));   
            Add('PanningHeight:   '   +   IntToStr(PrinterInfo.DeviceMode.dmPanningHeight));   
        end;   end;
      

  5.   

    谢谢 oushengfen 啊.我的好多问题,你都回复过...不好意思啊,最近这些时间,没有查看这个帐子.呵呵,问题我自己解决了:
    我用的是EPSON 220 PB 的打印机,打印小票的部分,全部用的EPSON打印机指令搞定的. EPSON北京公司提供了技术支持.
    关于获取打印机的状态,我直接用的 WinIO.dll 这个动态库,直接获取并口状态位的高低电平信号来判断打印机的状态.现在连打印机驱动也不用安装了.