Q&A

  • 프린터 스풀에 내용이 있는지 없는지 체크하는 방법 문의

프린터 스풀에 내용이 있는지 없는지 체크하는 방법 문의

 

스풀로 출력물을 보내서 출력물을 이미지로 만드는 형태를 이미지 프린터 드라이버를 사용해서

하는데 스풀에 내용이 있는지 없는지 확인은 어떻게 하는지요?

특정 폴더에 이미지를 만들고 있는 도중에 이미지 파일 리스트를 FTP 전송하려고 할때

해당 이미지 파일이 없다는 메시지가 떠서 전송이 중단되어서 스풀에 내용이 없는지를

체크하고 FTP 전송하는 방법을 사용하려고 합니다.

도움 주시면 감사하겠습니다.

1  COMMENTS
  • Profile
    이정욱 2013.10.11 19:34

    EnumJobs 를 사용하면 될 것 같습니다.


    아래는 예제 입니다.


    uses 
      Winspool, Printers; 
    
    
    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 SavePChar(p: PChar): PChar; 
    const 
      error: PChar = 'Nil'; 
    begin 
      if not Assigned(p) then 
        Result := error 
      else 
        Result := p; 
    end; 
    
    
    procedure TForm1.Button1Click(Sender: TObject); 
    type 
      TJobs  = array [0..1000] of JOB_INFO_1; 
      PJobs = ^TJobs; 
    var 
      hPrinter: THandle; 
      bytesNeeded, numJobs, i: Cardinal; 
      pJ: PJobs; 
    begin 
      hPrinter := GetCurrentPrinterHandle; 
      try 
        EnumJobs(hPrinter, 0, 1000, 1, nil, 0, bytesNeeded, 
          numJobs); 
        pJ := AllocMem(bytesNeeded); 
        if not EnumJobs(hPrinter, 0, 1000, 1, pJ, bytesNeeded, 
          bytesNeeded, numJobs) then 
          RaiseLastWin32Error; 
        memo1.Clear; 
        if numJobs = 0 then 
          memo1.Lines.Add('No jobs in queue') 
        else 
          for i := 0 to Pred(numJobs) do 
            memo1.Lines.Add(Format('Printer %s, Job %s, Status (%d): %s', 
              [SavePChar(pJ^[i].pPrinterName), SavePChar(pJ^[i].pDocument), 
              pJ^[i].Status, SavePChar(pJ^[i].pStatus)])); 
      finally 
        ClosePrinter(hPrinter); 
      end; 
    end;