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.