Como saber se a impressora esta ligada
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;
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
Curtidas 0
Respostas
Afarias
29/09/2004
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+
T+
GOSTEI 0
Dopi
29/09/2004
Realmente esse código só funciona em Win9x...
Estive tentando fazer isso usando uma Thread e um Intervalo de TimeOut.
+ ou - assim...
A Thread:
Uso:
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...
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]) ; 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...
GOSTEI 0
Walbicudo
29/09/2004
[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
Caro colega [color=red:90cc5a5857]afarias [/color:90cc5a5857]teria como voce disponibilizar um exemplo de como checar a impressora pelo API do WINDOWSXP
GOSTEI 0
Khundalini
29/09/2004
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
[]s
Rubem Rocha
Manaus, AM
GOSTEI 0