Obtener el estado de la impresora

Hola nuevamente antipauli. Necesito obtener el estado de la impresora, he encontrado algunas formas de hacerlo, la mayoria utilizan código de ensamblador como esta:
function TestPrinterStatus(LPTPort: word): byte;
var
Status: byte;
CheckLPT: word;
begin
Status := 0;
if (LPTPort >= 1) and (LPTPort <= 3) then
begin
CheckLPT := LPTPort -1;
asm
mov dx, CheckLPT;
mov al, 0;
mov ah, 2;
int 17h;
mov &Status, ah;
end;
end;
Result := Status;
end;
Mi problema es que de esta manera mediante código ensamblador no funciona bajo Windows NT o 2000, Manda un error de violación al momento de llamar la interrupción de DOS. ¿Conoces otra forma de hacer esto, o que no de problemas en Windows NT y 2000?.
Saludos.
Gerardo.

1 respuesta

Respuesta
1
Puedes utilizar la llamada de Win32 API "GetPrinter" que solicita la estructura PRINTER_INFO_2.
Procedure TForm1.ShowPrinterStatus( const PrinterName : String );
Var
PrinterInfo: PPrinterInfo2;
PrinterHandle : THandle;
Stat : LongBool;
requiredSize : Cardinal;
Begin
Try
Stat := OpenPrinter( PChar(PrinterName), PrinterHandle, NIL ); //
This works fine
If ( Stat )
Then
Begin
Try
GetMem( PrinterInfo, 1024 );
Stat := GetPrinter(PrinterHandle, 2, PrinterInfo, 1024,
@requiredSize );
Edit2.Text := 'Printer Name Is: ' +
PrinterInfo^.pPrinterName;
Case PrinterInfo^.Status of
0 : Edit1.Text := 'Printer Ready!';
PRINTER_STATUS_DOOR_OPEN : Edit1.Text := 'Door Open';
PRINTER_STATUS_POWER_SAVE : Edit1.Text := 'Power Save
Mode';
PRINTER_STATUS_WARMING_UP : Edit1.Text := 'Warming Up';
PRINTER_STATUS_PAPER_OUT : Edit1.Text := 'Out of Paper';
End;
Finally
FreeMem( PrinterInfo, 1024 );
End;
End
Else
Begin
Edit1.Text := 'NA';
Edit2.Text := 'Cannot Open Printer: ' + PrinterName;
End;
Finally
ClosePrinter( PrinterHandle );
End;
End;

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas