Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wander.junior

Pegar Status da Impressora Delphi

Recommended Posts

Olá Boa Tarde ,

Trabalho com Delphi a algum tempo e estou precisando de uma rotina que eu passe o nome da impressora e ela me diga se está online ou offline.

Eu tenho está rotina só que ela não está funcionando 100% , na maioria das vezes ela traz errado o status.

function TSMIMP.GetPrinterStatus(aName: string): String;
var PrintersInfo : PPrinterInfo2;
pcbNeeded, pcReturned, jpcbNeeded, jpcReturned : Cardinal;
I, J: Integer;
hPrinter: THandle;
JobInfo, TmpJobInfo: PJobInfo3;
phPrinter ,cbBuf : cardinal;
Need :PDWORD;
aJobs : integer;
aStatus : integer;
ResTex : Byte;
begin
Application.ProcessMessages;
aStatus := -1;
aJobs := 0;
Result := '';

EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS, nil, 2, PrintersInfo, 0, pcbNeeded,
pcReturned);

if GetLastError = ERROR_INSUFFICIENT_BUFFER then
begin
GetMem(PrintersInfo, pcbNeeded);
try
if EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS , nil, 2,PrintersInfo,
pcbNeeded, pcbNeeded, pcReturned) then
begin
for I := 0 to pcReturned - 1 do
begin
if PrintersInfo^.pPrinterName = aName then
begin
aStatus := PrintersInfo^.Status;
aJobs := PrintersInfo^.cJobs;

if aStatus = 0 then
begin
Result := 'S';
end else
begin
Result := 'N';
end;

break;
end;

inc(PrintersInfo);
end;
end else
begin
RaiseLastOSError;
end;
finally
try
FreeMem(PrintersInfo);
except

end;
end;
end else
begin
RaiseLastOSError;
end;
end;

Lembrando que a impressora pode estar tanto por rede ou local.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na sua unit, faça a chamada abaixo:

 

While not PrinterOnline() do

begin

  MsgBox('Verifique a Impressora!','ATENÇÃO');

end;

 

Function PrinterOnLine : Boolean;

Const

  PrnStInt : Byte = $17;

  StRq : Byte = $02;

  PrnNum : Word = 0; { 0 para LPT1, 1 para LPT2, etc. }

Var

  nResult : byte;

Begin (* PrinterOnLine*)

  Asm

  mov ah,StRq;

  mov dx,PrnNum;

  Int $17;

  mov nResult,ah;

end;

  PrinterOnLine := (nResult and $80) = $80;

End;

 

Verificar se a impressora está conectada:

 

A dica abaixo apresenta o código para implementação de uma função para verificar se a impressora esta conectada.

Para implementar esta função é necessário que o código gerado manipule algumas interrupções da Bios (Sistema Básico de Entrada e Saída) responsáveis pelo controle da porta paralela (Interrupção $17).

A interrupção $17 utiliza dois registros ah e dx, o registrador ah indica neste caso o acesso a porta paralela e o registrador dx indica qual das portas será testada, 0 para LPT1 e 1 para LPT2.

Para saber se a porta esta ligada (impressora conectada) o resultado da operação de tratamento de interrupção deve ser $80.

Código Completo:

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;

 

Não testei, dica tirada da internet. Espero que ajude

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.