Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   falla getJobs() acceder a los jobs de la cola de impresion con getJobs() (https://www.clubdelphi.com/foros/showthread.php?t=7375)

orfeo 13-02-2004 02:42:55

falla getJobs() acceder a los jobs de la cola de impresion con getJobs()
 
Necesito inspeccionar la cola de imprecion de win2000, estoy intentando
sacar la info del jobs 1, pero falla GetJob() (no logro recuperar la ectructura jobsInfo2)

ok:= GetJob(MangoPrinter,1,2,jobsInfo2,1000,@jobsInfo2Size); //retorna jobsInfo2Size=0

Esto es mi primer uso de APIs, y la verdad es que todaba no se que es
cada cosa.

La primer parte (sin GetJob) del codigo la saque de TrucoMania,
OpenPrinter devolvio un handle corecto, GetPrinter() retorna en PrinterInfo2
informacion corecta, el problema esta en getJobs().

NOTA:al momento de correr el codigo tengo 3 archivos en cola.

Necesito que me digan que esta mal, porque la 1da llamada de getJobs()
retorna jobsInfo2Size=0 haciendo inaccecible la estructura jobsInfo2.


Código:

      /---Codigo --------
          jobsInfo2    :^TJobInfo2; //Nota: Probe con ^TJobInfo1[AW], ^TJobInfo2[AW]
          jobsInfo2Size :DWORD;
          MangoPrinter  : THandle;

          GetMem(PrinterInfo2, 1000);
          Ok := GetPrinter(Integer(MangoPrinter), 2, PrinterInfo2, 1000, @Ocupa);

          if not Ok then
          if (Ocupa > 1000) then
              begin
                FreeMem(PrinterInfo2);
                GetMem(PrinterInfo2, Ocupa);
                GetPrinter(MangoPrinter, 2, PrinterInfo2, Ocupa,@Ocupa);
                //nota: PrinterInfo2 tiene datos correctos, por lo tanto el MangoPrinter esta correto

                GetMem(jobsInfo2,1000);
                //GetJob(hPrinter,JobId,Level,pJob, DWORD cbBuf, pcbNeeded)
                ok:= GetJob(MangoPrinter,1,2,jobsInfo2,1000,@--+//ret jobsInfo2Size=0
                if (not ok) then
                  begin
                    FreeMem(jobsInfo2);
                    GetMem(jobsInfo2,jobsInfo2Size);
                    GetJob(MangoPrinter,1,2,jobsInfo2,jobsInfo2Size,@jobsInfo2Size);
                end;

                // y Obiamente falla aqui.
                ShowMessage('POS:' + intToSTR(jobsInfo2^.Position) );

            \---Codigo --------

            /--Prototipe Jobs:
            The GetJob function retrieves print-job data for the specified printer.
              BOOL GetJob(
                  HANDLE hPrinter,        // handle of printer
                  DWORD JobId,        // job identifier value
                  DWORD Level,        // data-structure level
                  LPBYTE pJob,        // address of data-structure array
                  DWORD cbBuf,        // count of bytes in array
                  LPDWORD pcbNeeded        // address of value that contains count of bytes retrieved (or required)
                  );

            \--Prototipe Jobs:


delphi.com.ar 13-02-2004 14:24:23

Según la MSDN, esta función está disponible en W2k... pero me parece haber leído anteriormente que uno de los services packs de W2k solucionaba problemas del spool, ¿Tenés todos los SP instalados?

Saludos!

orfeo 21-02-2004 03:05:44

Cita:

Empezado por delphi.com.ar
Según la MSDN, esta función está disponible en W2k... pero me parece haber leído anteriormente que uno de los services packs de W2k solucionaba problemas del spool, ¿Tenés todos los SP instalados?

Saludos!

en el api que trae el Delphi 5 dice que es soportado por todos los windws.

tengo win2k Profecional + SP4

delphi.com.ar 23-02-2004 00:20:11

Cita:

Empezado por orfeo
en el api que trae el Delphi 5 dice que es soportado por todos los windws.

Esto es discutible... digamos que cuando salió Delphi 5 creo que Borland lo catalogó como compatible con Win95, Win98 y NT4 (Creo)... ahora, que sea compatible con las versiones futuras ya depende del fabricante del sistema operativo (M$), se supone que W2k es compatible con la aplicaciones compiladas para NT4, pero esto lo garantiza M$!

Me resulta extraño que esto falle.. no te prometo, pero si tengo un tiempo lo voy a probar en un W2k sp4 que tengo en un disco removible.

Saludos!

orfeo 25-02-2004 05:18:26

Cita:

Empezado por delphi.com.ar
Me resulta extraño que esto falle.. no te prometo, pero si tengo un tiempo lo voy a probar en un W2k sp4 que tengo en un disco removible.

Saludos!

El codigo es correcto? Es correcto como defino el tamano de la structura jobsInfo2?
POr otro lado, la descripcion de la funcion getJobs dice que esta soportada por NT, win95, como decis... Voy a ver si consigo algo para w2k



UNA CORRECCION: me equivoque en la version de Delphi, Uso Delphi 6 en Win2k Profecional + SP4

orfeo 29-04-2004 04:57:58

si a alguien le interesa..., ya lo hice andar..

el codigo es correcto, mi error fue de interpretacion del API jobs(), la variable JobId indica un numero unico (similar a PID de procesos) y yo suponia que era la posicion de la cola de imprecion. :p

roman 29-04-2004 05:04:57

A mi me interesaría y muy posiblemente a varios más. ¿Por qué no pones aquí el código final?

// Gracias

orfeo 09-05-2004 03:32:43

Codigo de uso de la API32 EnumJobs() (Jobs de cola de imprecion)
 
Estoy poniendo el código que permite listar los trabajos de la cola de impresión de Windows.
Este código lo he probado en win2k Profesional +SP4, compilándolo con Delphi 6
En este ejemplo retorno solo el formato de JOB_INFO_2 para los trabajos, pero hay otros mas, el ejemplo debería servir para los otros formatos simplemente cambiando los tipos y algunas modificaciones sencillas.

Unidades necesarias:
Printers , WinSpool,SysUtils,Types

Pasos Y Explicacion de Uso:

1- Recuperar el hander de la impresora:
la funcion getHandlePrinter(PrinterNumber:word):THandle; realiza este trabajo llamando a la función de API32 OpenPrinter.

2- Recupero los trabajos de la cola de impresión:
la función getJobsInfo2(HandleIMP); llama a EnumJobs() dos veces.
La primera ves: envía la estructura enumJobInfo_2: TPArrayJOB_INFO_2; con con tamaño de 1000 bytes.
Si EnumJobs() falla (OkJobs=false) este retorna en jobNeeded el tamaño de bytes necesarios para almacenar todos los trabajos en la estructura enumJobInfo_2:TPArrayJOB_INFO_2 para luego poder llamar a EnumJobs() por 2da ves y que esta retorne los trabajos en enumJobInfo_2.
La cantidad de trabajos es retornado en JobReturned.


Tipos que tuve que definir:
Código:

      const
            MAXJobs=1000
      type
        TArrayJOB_INFO_2    = array [0..MAXJobs] of JOB_INFO_2;
        TPArrayJOB_INFO_2 =^TArrayJOB_INFO_2;

function getHandlePrinter(PrinterNumber:word):THandle;
Código:

function  getHandlePrinter(PrinterNumber:word):THandle;
var
    Defaults          : TPRINTERDEFAULTS;
    NombreImpresora  : string;
    Ok                : boolean;
    MangoPrinter      : THandle;


begin

  try
    NombreImpresora := Printer.Printers.Strings[PrinterNumber];
    {Eliminamos el "on LPT"}
    if Pos(' on ',NombreImpresora)<>0 then
      NombreImpresora:=Copy (NombreImpresora,1,Pos(' on ',NombreImpresora)-1);

    Defaults.DesiredAccess := PRINTER_ALL_ACCESS;
    Defaults.pDatatype := nil;
    Defaults.pDevMode := nil;

    Ok := OpenPrinter(PChar(NombreImpresora), MangoPrinter, @Defaults);

    if (Ok)
      then getHandlePrinter:=MangoPrinter
      else raise  Exception.create('OpenPrinter no pudo recuperar el Handle de la impresora '+NombreImpresora);
  except
  end;
end;

procedure getJobsInfo2(Handle:THandle);
Código:

procedure  getJobsInfo2(Handle:THandle);
var

  enumJobInfo_2    :TPArrayJOB_INFO_2;

  JobInfoNumer    :DWord;
  JobInfo        : JOB_INFO_2;

  JobNeeded        :DWORD;
  JobReturned      :DWORD;
  jobId            :Dword;
  okJobs          :boolean;
begin

    GetMem(enumJobInfo_2,1000);
    JobInfoNumer:=2;

    OkJobs :=EnumJobs(Handle,0,MAXJobs ,JobInfoNumer,enumJobInfo_2,1000,JobNeeded,JobReturned);

    if not OkJobs then
      begin
          FreeMem(enumJobInfo_2);
          GetMem(enumJobInfo_2, JobNeeded);
          OkJobs :=EnumJobs(Handle,0,MAXJobs,JobInfoNumer,enumJobInfo_2,JobNeeded,JobNeeded,JobReturned);
      end;
end;



La franja horaria es GMT +2. Ahora son las 23:53:48.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi