Clipper On Line • Ver Tópico - Impressora on-line / off-line

Impressora on-line / off-line

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

Impressora on-line / off-line

Mensagempor alejesus » 01 Jun 2018 17:07

Boa tarde pessoal.

Alguém tem ideia de como poderia colocar a impressora on-line e/ou off-line via linha de comando no Windows?

Obrigado,
Alexandre Bassanezi
Desenvolvimento Harbour/Lazarus/PHP e MySQL
http://www.cpen.com.br
Avatar de usuário

alejesus
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 15
Data de registro: 09 Jun 2010 20:58
Cidade/Estado: Osasco - SP
Curtiu: 2 vezes
Mens.Curtidas: 0 vez

Impressora on-line / off-line

Mensagempor Shark » 01 Jun 2018 17:26

Questão intrigante esta visto que o windows gerencia isto perfeitamente. Uma vez a impressora instalada e não havendo resposta da mesma em dado momento o windows a coloca como off-line e vice versa.
Shark
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 28
Data de registro: 25 Set 2017 21:42
Cidade/Estado: Brasília - DF
Curtiu: 5 vezes
Mens.Curtidas: 3 vezes

Impressora on-line / off-line

Mensagempor asimoes » 01 Jun 2018 18:13

alejesus escreveu:Alguém tem ideia de como poderia colocar a impressora on-line e/ou off-line via linha de comando no Windows?


Qual é a finalidade disso ?
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Impressora on-line / off-line

Mensagempor alejesus » 04 Jun 2018 11:36

Bom dia.

Shark / Asimoes, a situação que estou encontrando é que o Windows coloca a impressora off-line e depois disto só com boot pra voltar a funcionar.

No caso a pessoa que opera o sistema, como na maioria das vezes, é leigo e para evitar suporte estava pensando em fazer o comando de impressora on-line para garantir que a mesma não esteja off-line por qualquer razão, segurando as impressões até que alguém vá lá e coloque a mesma on-line.

Veja a situação que já consegui mapear:

- O operador liga o computador
- Após tudo funcionando, ele percebe que a impressora ficou desligada, então liga
- No Windows a impressora está off-line (Usar impressora off-line)
- Todas as impressões ficam paradas na impressora até que se coloque a mesma on-line manualmente, sendo que algumas vezes só reiniciando pra que a impressão seja reiniciada.

Obrigado pela atenção, vamos ver se consigo alguma orientação com este problema.
Alexandre Bassanezi
Desenvolvimento Harbour/Lazarus/PHP e MySQL
http://www.cpen.com.br
Avatar de usuário

alejesus
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 15
Data de registro: 09 Jun 2010 20:58
Cidade/Estado: Osasco - SP
Curtiu: 2 vezes
Mens.Curtidas: 0 vez

Impressora on-line / off-line

Mensagempor asimoes » 04 Jun 2018 12:05

Creio que até já tenha feito isso, tentou reinstalar o driver da impressora ?
Existe outra impressora do mesmo modelo ?
O driver que instalou é o do fabricante ou é um desses genéricos (oem) ?
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Impressora on-line / off-line

Mensagempor Kapiaba » 04 Jun 2018 12:32

veja se ajuda:

   REDEFINE BUTTON oStatusImp ID 302 OF oDlgCCe ;
            ACTION ( STATUS_DA_IMPRESSORA() )

   oStatusImp:cToolTip := OemToAnsi( "Verifique o Status da(s) Sua(s) Impressora(s) Inclusive Virtual" )

Function STATUS_DA_IMPRESSORA()

   aArray := GetPrinters( .T. )

   If Empty( aArray )

      Alert( "Nenhuma impressora Instalada", "Atencao" )

      Return Nil

   Endif

   for i = 1 to len(aArray)

      cPrinterName := substr( aArray[i], 1, at( ",", aArray[i])-1 )

      //? "A impressora " + cPrinterName, IsPrint( alltrim( cPrinterName ) )

      MsgInfo( ( "A Impressora " + cPrinterName )+CRLF+ ;
                                                 +CRLF+ ;
               IsPrint( alltrim( cPrinterName ) ),      ;
               OemToAnsi( "Aten‡Æo Usu rio" ) )

   next

Return nil

Function GetPrinters()

   Local aPrinter := {}
   Local cAllEntries
   Local cEntry
   Local nStart
   Local cName
   Local cPrn
   Local cPort
   Local nJ

   cAllEntries := STRTRAN( GetProfString( "Devices" ), Chr( 0 ), CRLF )

   For nStart := 1 To MlCount( cAllEntries )

       cName  := MemoLine( cAllEntries,,nStart)
       cEntry := GetProfString( "Devices",cName,"")
       nJ     := 2

       Do While ! Empty(cPort := StrToken(cEntry,nJ++,","))
          Aadd(aPrinter,Trim(cName)+" , "+Trim(cPort))
       EndDo

   Next

Return(aPrinter)

function IsPrint( QuePrinter )

   LOCAL nStatus

   DEFAULT QuePrinter := "LPT1:"

   nStatus := PrnStatus( QuePrinter )

   if     nStatus <        1 ; return "Impressora Esta Funcionando OK"
   elseif nStatus =        1 ; return "Impressora Pausada"
   elseif nStatus =        2 ; return "Impressora com Erro"
   elseif nStatus =        4 ; return "Impressora Deletando"
   elseif nStatus =        8 ; return "Impressora em Modo Bandeija"
   elseif nStatus =       16 ; return "Impressora Sem Papel"
   elseif nStatus =       32 ; return "Impressora em Modo Manual"
   elseif nStatus =       64 ; return "Impressora com Problema no Papel"
   elseif nStatus =      128 ; return "Impressora Off Line(Desligada)"
   elseif nStatus =      256 ; return "Impressora com IO Ativo"
   elseif nStatus =      512 ; return "Impressora Ocupada"
   elseif nStatus =     1024 ; return "Impressora Imprimindo"
   elseif nStatus =     2048 ; return "Impressora Memoria Lotada"
   elseif nStatus =     4096 ; return "Impressora Nao Instalada"
   elseif nStatus =     8192 ; return "Impressora Aguardando"
   elseif nStatus =    16384 ; return "Impressora Processando"
   elseif nStatus =    32768 ; return "Impressora Inicializando"
   elseif nStatus =    65536 ; return "Impressora em Atencao"
   elseif nStatus =   131072 ; return "Impressora Toner Baixo"
   elseif nStatus =   262144 ; return "Impressora Sem Toner"
   elseif nStatus =   524288 ; return "Impressora PAGE_PUNT(Ineficinte)"
   elseif nStatus =  1048576 ; return "Impressora Intervencao do Usuario"
   elseif nStatus =  2097152 ; return "Impressora Sem Memoria"
   elseif nStatus =  4194304 ; return "Impressora Tampa Aberta"
   elseif nStatus =  8388608 ; return "Impressora Servidor Desconhecido"
   elseif nStatus = 16777217 ; return "Impressora POWER_SAVE(Poupando Energia)"
   endif

RETURN ( nStatus )
Kapiaba
Colaborador

Colaborador
 
Mensagens: 1765
Data de registro: 07 Dez 2012 15:14
Cidade/Estado: São Paulo
Curtiu: 310 vezes
Mens.Curtidas: 119 vezes

Impressora on-line / off-line

Mensagempor asimoes » 04 Jun 2018 13:19

Fiz uma leitura melhor do que foi pedido:

How To Modify Printer Settings by Using SetPrinter

No link abaixo tem a informação para Resetar a impressora ou modificar o status dela.

https://support.microsoft.com/en-us/hel ... setprinter

Procurei na MiniGui existe a função EF_RESETPRINTER no fonte winprint.prg teria que isolar o código para somente chamar a função EF_RESETPRINTER que modifica o status da impressora.
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Impressora on-line / off-line

Mensagempor rochinha » 04 Jun 2018 13:40

Amiguinhos,

Ao invés de manusear uma impressora específica o melhor é manusear o spooler.

Vejamos como esta no meu sistema:
  local oMenu
  MENU oMenu POPUP
       MENUITEM "Configura Impressora" ACTION PrinterSetup()
       SEPARATOR
       MENUITEM "Configura Spooler"
      MENU
           MENUITEM "Desliga Spooler" ACTION fSpooler( 1 )
           MENUITEM "Liga Spooler" ACTION fSpooler( 2 )
           MENUITEM "Limpa Fila de Impressao" ACTION fSpooler( 3 )
      ENDMENU
       SEPARATOR

Vejamos o que a fução chamada faz:
/*
* Função de manutenção do serviço de spooler de impressoras
*/
FUNCTION fSpooler( opcao, limpaSpool )
   LOCAL oSpooler, nInvisivel := 7

   LOCAL strService := "SPOOLER"
   LOCAL cSpoolPath := getEnvironmentString( "WINDIR" ) + "\SYSTEM32\SPOOL\PRINTERS"

   DEFAULT limpaSpool := "N"
   DEFAULT opcao      := 2

   // Cria objeto oSpooler
   oSpooler := TOleAuto():New( "Wscript.Shell" )
   
   // Se escolha foi Desligar
   do case
      case opcao = 1
          // Desliga serviço
           //oWnd:SetText( "Desligando o serviço de Spool..." )
           SysWait( 5 )
           oSpooler:run( "net stop " + strService, nInvisivel )
           //oWnd:SetText( "Serviço de spool desligado..." )
           SysWait( 5 )
          //
      case opcao = 2
          // Liga serviço
           //oWnd:SetText( "re-ligando o serviço de Spool..." )
           SysWait( 5 )
           oSpooler:run( "net start " + strService, nInvisivel )
           //oWnd:SetText( "Serviço de spool re-ligado..." )
           SysWait( 5 )
          //
      case opcao = 3
          // Desliga serviço
           //oWnd:SetText( "Desligando o serviço de Spool..." )
           SysWait( 5 )
           oSpooler:run( "net stop " + strService, nInvisivel )
          // Processa limpeza da fila de impressões
           //oWnd:SetText( "Processando limpeza no spool..." )
           SysWait( 5 )
           nContador := adir( cSpoolPath + "\*.*" )
           if nContador != 0
              DECLARE TXT_NOMES[ nContador ]
              adir( cSpoolPath + "\*.*", TXT_NOMES )
              for nContador = 1 TO LEN( TXT_NOMES )
                  fErase( cSpoolPath + "\" + TXT_NOMES[ nContador ] )
              next
           endif
           // Se quiser esperar algum tempo basta configurar
           SysWait( 5 )
          // reLiga serviço
           //oWnd:SetText( "re-ligando o serviço de Spool..." )
           SysWait( 5 )
           oSpooler:run( "net start " + strService, nInvisivel )
           //oWnd:SetText( "Serviço de spool ligado..." )
           SysWait( 5 )
          //
   endcase

   // Elimina objeto oSpooler
   oSpooler:End()

   RETURN NIL

A função SysWait() é somente um pause cronometrado.

Mais um trecho importante:
   // Verificacao de existencia de impressora instalada e/ou configurada
   do case
      case GetPrintDefault()=0 .and. empty( GetPrinter() )
           ? "Nenhuma impressora esta instalada."
      case GetPrintDefault()=0 .and. !empty( GetPrinter() )
           ? "Servico de Spool esta desativado ou nenhuma impressora como padrao."
      case GetPrintDefault()<>0
           // Bloco que perfaz uma busca das impressoras instalados no sistema
           //aPrinter := GetPrinters()
           //for i = 1 to len(aPrinter)
           //    cPrinter := aPrinter[i]
           //    cPort    := substr(cPrinter,at(",",cPrinter)+1,20)
           //    if MsgYesNO( "Colocar impressora " + cPrinter + " como padrao?" )
           //       //SetPrinter( substr(cPrinter,1,at(",",cPrinter)-1) )
           //       SetPrintDefault( substr(cPrinter,1,at(",",cPrinter)-1) )
           //       // PrinterPortToName( substr(cPrinter,1,at(",",cPrinter)-1) ) // ( "USB002" )
           //       PrinterInit()
           //       //SetDefaultPrinter( substr(cPrinter,1,at(",",cPrinter)-1) )
           //    endif
           //next
   endcase
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes

Impressora on-line / off-line

Mensagempor asimoes » 04 Jun 2018 13:54

Não tenho como testar essa função porque todas as impressoras daqui estão em rede são gerenciadas pela novell.
A função SetPrinter é que vai mudar o status da impressora de disable para enable, eu não sei isso tem haver com offline/online só fazendo testes.


bOk := ResetPrinter()

#pragma BEGINDUMP

#include "hbapiitm.h"

#include <olectl.h>
#include <commctrl.h>

static PRINTER_INFO_2 * pi22      = NULL; // to restore printer dev mode after print.
static HANDLE           hPrinter  = NULL;

HB_FUNC( RESETPRINTER )
{

   BOOL bFlag;

   bFlag = SetPrinter(hPrinter, 0, (byte*)0, PRINTER_CONTROL_SET_STATUS) ;
   
   if ( bFlag )
      hb_retl( 0 );
   else
      hb_retl( 1 );   
 
}

#pragma ENDDUMP
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Impressora on-line / off-line

Mensagempor asimoes » 04 Jun 2018 13:58

Quando eu chegar em casa terei como testar nas minhas impressoras.
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Impressora on-line / off-line

Mensagempor alejesus » 04 Jun 2018 14:12

Boa tarde pessoal.

Agradeço a todos as informações, vou analisar e testar tudo que foi informado e retorno com mais detalhes.

Um abraço!
Alexandre Bassanezi
Desenvolvimento Harbour/Lazarus/PHP e MySQL
http://www.cpen.com.br
Avatar de usuário

alejesus
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 15
Data de registro: 09 Jun 2010 20:58
Cidade/Estado: Osasco - SP
Curtiu: 2 vezes
Mens.Curtidas: 0 vez

Impressora on-line / off-line

Mensagempor asimoes » 04 Jun 2018 15:51

Rochinha perguntas:

usando net start spooler se a impressora estiver offline que é o problema do colega ela mudará o status para online ?
â–ºHarbour 3.x | Minigui xx-x | HwGuiâ—„
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4919
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 341 vezes
Mens.Curtidas: 258 vezes

Impressora on-line / off-line

Mensagempor rochinha » 04 Jun 2018 21:24

Amiguinhos,

Rochinha perguntas:
usando net start spooler se a impressora estiver offline que é o problema do colega ela mudará o status para online ?


Vejamos impressora ligada não é o mesmo que on-line e vice-versa. Só pra tentar explicar o que acontece.

O Spooler é a ponte entre o S.O. e o hardware. Para a impressora ficar ligada para o usuário mas off-line para o S.O. deveriamos acionar comandos fisicos nela ou comandar operações via gerenciadores.

Quando desligamos o Spooler tornamos a impressora invisivel ao S.O. portanto ele pensa que ela está off-line ou desligada.

Às vezes impressões ficam enroscadas no spool e mesmo deletando tem sempre um que não sai nem com reza-braba. Ai temos de falar para o usuário: "Desliga e liga a impressora".

Aí a mesma está em outra sala, outro andar e fica ruim.

Para excluir os .SPLs gerados no spool diretamente sem desligar o spooler não dá, alguns arquivos ficam preso com quesito de em uso.

Então, desligando o spooler, os arquivos em cache da mesma desaparecem, o spool fica livre para eliminação e a impressora "desligada".

O comando start/stop spooler somente baixa/levanta a ponte mas não diz o estado da impressora.

Testar o spooler evita erros de falta de impressoras instaladas. Ao ligá-lo teremos visão das mesmas e podemos testar seus status.

Por isto coloquei um trecho de testes.

Alguns testes de verificação de impressoras pode nos iludir ao mostrar que as impressoras estão off-line, quando na verdade o spooler é que está parado.

O spooler ativo nos devolve a lista de impressoras quando ligado. Se desligado não devolve nada podendo assim desta forma colocar critica para erro de envio de comando para impressora que não existe ou não está ativa.

Sem o spooler, não temos lista de impressoras, sem impressoras não podemos enviar comandos SET Printer para ativa-las ou desativar ou ver seu estado.

Portanto, tudo depende.

Ou, em resposta a sua pergunta eu podeira simplesmente dizer, NÃO
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para fivolution@hotmail.com. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar de usuário

rochinha
Membro Master

Membro Master
 
Mensagens: 4538
Data de registro: 18 Ago 2003 20:43
Cidade/Estado: São Paulo - Brasil
Curtiu: 800 vezes
Mens.Curtidas: 242 vezes




Retornar para Harbour

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 9 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro