Como saber se a impressora esta ligada

29/09/2004

Pessoal, peguei esta dica função no forum para saber se aimpressora esta ligada mas no win xp ela não funciona.
Algum saberia me dizer porque lea não funciona o XP?
Desde já muito obrigado.
Function OnLine(Porta:Word):Boolean;
Const
Portas :Byte = $02;
Var
Res :Byte;
Begin
{ Código em Assembler }
Asm
mov ah,Portas; {Requisita o acesso as portas}
mov dx,Porta;{Define a porta de teste}
Int $17; {Chama a interrupção de Impressora}
mov Res,ah; {Guarda em Res o resultado da operação }
end;
Result := (Res and $80) = $80; {Testa o valor de saída}
End;


Debug

Respostas

29/09/2004

Afarias

Pela arquitetura do NT (por isso NT4, 2000 e XP são mais robustos) que não permite chamadas diretas no hardware. Vc tem q usar a api do SO para fazer qualquer coisa.


T+


Responder Citar

29/09/2004

Dopi

Realmente esse código só funciona em Win9x...

Estive tentando fazer isso usando uma Thread e um Intervalo de TimeOut.

+ ou - assim...
procedure TForm1.Imprimir( Porta, Texto : String; Tempo : Integer );
Var TempoFinal : TDateTime ;
    IsTimeOut : Boolean ;
    TP : ThreadEnviaLPT ;
begin
  TempoFinal := IncMilliSecond(now,Tempo) ;
  IsTimeOut  := false ;

  TP := ThreadEnviaLPT.Create( Porta, Texto ) ;
  try
     while (not TP.Terminated) and (not IsTimeOut) do
     begin
        IsTimeOut := (now >  TempoFinal) ;
        sleep(50) ;
        Application.ProcessMessages ;
     end ;
  finally
     TP.Terminate ;
     TP.Free ;

     if IsTimeOut then
        raise Exception.CreateFmt( ´Impressora em: ¬s nao está pronta´,[Edit2.Text&93;) ;
  end ;

end;


A Thread:
type
  ThreadEnviaLPT = class(TThread)
  private
    { Private declarations }
    fsTexto : String ;
    fsPorta : String ;
  protected
    procedure Execute ; override;
  public
    constructor Create(Porta,Texto : String) ;
  end;

implementation

constructor ThreadEnviaLPT.Create( Porta,Texto : String);
begin
  inherited Create( false) ;  { Rodar Imediatamente }

//  FreeOnTerminate := true ;
  fsPorta := Porta ;
  fsTexto := Texto ;
end;


procedure ThreadEnviaLPT.Execute;
Var ArqPrn: TextFile;
begin
  AssignFile( ArqPrn, fsPorta );

  try
     ReWrite( ArqPrn );
     Write( ArqPrn, fsTexto ) ;
  finally
     System.CloseFile( ArqPrn ) ;
  end ;

  Terminate ;
end;


Uso:
  Imprimir( ´LPT1´, #0, 100);   { 100 milisegundos }


A ideia é: Se a Thread nao conseguir terminar antes do Timeout ocorrer, significa que a impressora nao conseguiu imprimir ( fora de linha )

Isso tb evita o congelamento do programa na linha: [b:f7e2fa1169]Write( ArqPrn, fsTexto ) ;[/b:f7e2fa1169] ou writeln, quando a impressora nao está pronta...


Responder Citar

23/10/2004

Walbicudo

[b:90cc5a5857]Pela arquitetura do NT (por isso NT4, 2000 e XP são mais robustos) que não permite chamadas diretas no hardware. Vc tem q usar a api do SO para fazer qualquer coisa. [/b:90cc5a5857]

Caro colega [color=red:90cc5a5857]afarias [/color:90cc5a5857]teria como voce disponibilizar um exemplo de como checar a impressora pelo API do WINDOWSXP


Responder Citar

25/10/2004

Khundalini

O exemplo ilustrado pelo Dopi é show de bola. Resta saber se ele funciona pra checar se uma impressora de rede está pronta ou não. No mais, é melhor do que procurar funções da API do Windows pra checar isso. Muito inteligente essa solução.

[]s
Rubem Rocha
Manaus, AM


Responder Citar