Verificar portas LPT2 em diante.

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

Moderador: Moderadores

marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Verificar portas LPT2 em diante.

Mensagem por marcos.gurupi »

Caros, teu tenho alguns problemas n muito serios mas q muitas vezes me tira d onde estou para ir configurar uma porta LPTx em rede ou mesmo dizer q devera chamar-se um tecnico para configurar a rede. Teria algum comando para testar a conectividade com as portas alem do LPT1, ou seja, portas paralelas em rede?

Marcos Roberto
Marcos Roberto
NetService Software
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Re: Verificar portas LPT2 em diante.

Mensagem por Pablo César »

Teria algum comando para testar a conectividade com as portas alem do LPT1
Não sei se entendí direito, mas testar conectividade de impressora em rede não acho que seja possível assim como é feito na impressora LOCAL em LPT1. Se o seu problema baseia-se em que as impressoras não ficam capturadas à LPT2 por exemplo e quando é mandado a imprimir dá erro ? Isto geralmente acontece muito em WIN98. Então eu sugeriria que sempre forçasse a captura da impressora. Tem duas formas:

1. Fazer um arquivo BATCH no C: e capturando de acordo cada estação e logo chamar o seu programa.
2. Ou colocar no próprio código fonte para que seja capturado, como por exemplo:

Código: Selecionar todos

VTERM:=UPPER(NETNAME())
IF !(VTERM="CREDIARIO_01")
   NETREDIR("LPT2","\\CREDIARIO_01\EPSON")
ENDIF
COPY FILE("FICHA.PRN") TO ("LPT2")
Existe o comando NET USE que se você direcionar para arquivo, como por exemplo: NET USE > NET.TXT você irá obter uma lista dos mapeamentos e impressora capturadas em rede. Mas testar se a impressora está ligada, por exemplo, não vai poder ser possível, pois essa checagem é feita sempre local.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: Verificar portas LPT2 em diante.

Mensagem por sygecom »

Olá,
De uma olhada nessa dica do Rochinha:
viewtopic.php?f=13&t=4678
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Verificar portas LPT2 em diante.

Mensagem por rochinha »

Amiguinho

Outra dica e é a que estou usando sempre é a de colocar tais informações em arquivos externos e nunca mais dentro do codigo de forma compilada.

Crie um modulo onde vc possa armazenar as impressoras, dando-lhes nomes e direções, salve em .DBFs ou arquivos .INI, deva uma dica usando .INI.

Código: Selecionar todos

VTERM:=UPPER(NETNAME())
//
lGrava      := .F. // Qdo .F. grava se nao existir, Qdo .T. grava mesmo que exista, reescrevendo
cPath        := CurDrive() + ":\" + Curdir() + "\"
cQueLPT1  := Upper(VerifyINI( VTERM, "LPT"    , "LPT1"                , cPath+"sistema.ini",lGrava))
cQualCaminho := Upper(VerifyINI( VTERM, "CAMINHO", "\\SERVIDOR\TERMINAL1", cPath+"sistema.ini",lGrava))
//
IF !(VTERM="CREDIARIO_01")
   NETREDIR( cQueLPT1, cQualCaminho )
ENDIF
COPY FILE("FICHA.PRN") TO ("LPT2")
[code]

Outro exemplo de uso de arquivos .INI:

[code]
function LimpaSpool()
   cEmiteMotor :=  Upper(VerifyINI("SISTEMA","Emite_Motor","WAPI",cPath+"pos"+M->CAIXA+".ini",.F.))
   if valtype(PRNcFile) <> "C"
      return .t.
   endif
   CONTADOR  := ADIR( "*.ecf" )
   IF CONTADOR != 0
      DECLARE TXT_NOMES[ CONTADOR ]
      ADIR( "*.ecf", TXT_NOMES )
      FOR CONTADOR := 1 TO LEN( TXT_NOMES )
          //WaitRun("write " + TXT_NOMES[CONTADOR] + "/p" ) 
          do case
             case cEmiteMotor = "COMMAND.COM"
                  WaitRun("command.com /c copy /b " + PRNcFile + " LPT1" , 0 )
             case cEmiteMotor = "WRITE"
                  WaitRun("write " + PRNcFile + " /p" )
             case cEmiteMotor = "WAPI" 
                  WaitRun( [WAPI -PRINT:"]+PRNcPort+[";]+PRNcFile+[;"Impressao";RESULTA.TXT], 7 )
          endcase
          //WAITRUN("command.com /c copy /b " + TXT_NOMES[CONTADOR] + " lpt1" , 0 )
          SysWait(2)
          if file( TXT_NOMES[CONTADOR] )
             FERASE( TXT_NOMES[CONTADOR] )
          endif
      NEXT
   ENDIF
   SysRefresh()
   return .t.
[code]

Funcao VerifyINI simplificada:

[code]
function VerifyINI( _section_, _entry_, _var_, _inifile_, _grava_ )
   oIni := TIni():New( _inifile_ )
   if _grava_ = .t.
      oIni:Set( _section_, _entry_, _var_ )
   endif
   return oIni:Get( _section_, _entry_, _var_, _var_ )
Codigo fonte da classe .INI, pondendo ser usada qualquer outra forma de escrita em arquivos .INI:

Código: Selecionar todos

#include "FiveWin.ch"
#include "DLL.ch"

//----------------------------------------------------------------------------//
CLASS TIni
   DATA   cIniFile, lAutoSet
   METHOD New( cIniFile ) CONSTRUCTOR
   METHOD Get( cSection, cEntry, uDefault, uVar )
   METHOD Set( cSection, cEntry, uValue )
   METHOD Sections()
   METHOD DelSection( cSection ) INLINE DelIniSection( cSection, ::cIniFile )
   METHOD DelEntry( cSection, cEntry ) INLINE ;
                       DelIniEntry( cSection, cEntry, ::cIniFile )
ENDCLASS

//----------------------------------------------------------------------------//
METHOD New( cIniFile ) CLASS TIni
   DEFAULT cIniFile := ""
   if ! Empty( cIniFile ) .and. At( ".", cIniFile ) == 0
      cIniFile += ".ini"
   endif
   ::cIniFile = cIniFile
   ::lAutoSet = .t.
return Self

//----------------------------------------------------------------------------//
METHOD Get( cSection, cEntry, uDefault, uVar ) CLASS TIni
   local cType := ValType( If( uDefault != nil, uDefault, uVar ) )
   if Empty( ::cIniFile )
      if cType == "N"
         uVar = GetProfInt( cSection, cEntry, uDefault )
      else
         uVar = GetProfString( cSection, cEntry, cValToChar( uDefault ) )
      endif
   else
      if cType == "N"
         uVar = GetPvProfInt( cSection, cEntry, uDefault, ::cIniFile )
      else
         uVar = GetPvProfString( cSection, cEntry, cValToChar( uDefault ),;
                                 ::cIniFile )
      endif
   endif
   do case
      case cType == "D"
           uVar = CToD( uVar )

      case cType == "L"
           uVar = ( Upper( uVar ) == ".T." )
   endcase
   if uVar == uDefault .and. ::lAutoSet
      ::Set( cSection, cEntry, uDefault)
   endif
return uVar

//----------------------------------------------------------------------------//
METHOD Set( cSection, cEntry, uValue ) CLASS TIni
   if Empty( ::cIniFile )
      WriteProfString( cSection, cEntry, cValToChar( uValue ) )
   else
      WritePProString( cSection, cEntry, cValToChar( uValue ), ::cIniFile )
   endif
return nil

//----------------------------------------------------------------------------//
METHOD Sections() CLASS TIni
   local cBuffer := Space( 4096 ), p, aSec:={}
   // cBuffer := Left( cBuffer, GetPvPrfSe( @cBuffer, 4095, ::cIniFile ) )
   p = GetPvPrfSe( @cBuffer, 4095, ::cIniFile )
   cBuffer = Left( cBuffer, p )
   while ( p := At( Chr( 0 ), cBuffer ) ) > 1
      AAdd( aSec, Left( cBuffer, p - 1 ) )
      cBuffer = SubStr( cBuffer, p + 1 )
   enddo
return aSec

//----------------------------------------------------------------------------//
DLL32 FUNCTION GetPvPrfSe(cBuffer AS LPSTR, nSize AS DWORD, cIni AS LPSTR) AS DWORD PASCAL ;
               FROM "GetPrivateProfileSectionNamesA" LIB "Kernel32.dll"
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder