Clipper On Line • Ver Tópico - Pin pad Gertec PPC 910
Página 1 de 5

Pin pad Gertec PPC 910

MensagemEnviado: 25 Out 2013 14:17
por DLZ
Ola pessoal..
Sei que esse assunto não tem nada a ver com Xharbour, mas sei que tem vários colegas aqui que usam TEF dedicado ( Sitef da softwareexpress) e quero ver se alguém está passando por esse problema tb..
Pela Clisitef.dll , ocorre o seguinte:
O pin pad funciona até o momento de pedir para passar/Inserir o cartão, ficando a msg na visor, porém qdo o cartão é passado/inserido, continua pedindo para passar o cartão e depois de um certo tempo da erro 31-Erro PinPad. Já entrei em contato com a Gertec e eles me passaram um aplicativo de testes e nesse aplicativo funciona perfeitamente.. Entrei em contato com a Softwareexpress, estão vendo o problema já tem 30 dias e nada de solução. Dizem que la funciona e tem vários outros clientes que funciona. Simplesmente não sei mais o que fazer..
Alguém está passando por isso ou já passou ?

Pin pad Gertec PPC 910

MensagemEnviado: 25 Out 2013 19:07
por Itamar M. Lins Jr.
Ola!
Cadê o código?

É xHarbour ou Harbour ? já tentou usando o Harbour 3.2 ?

Saudações,
Itamar M. Lins Jr.

Pin pad Gertec PPC 910

MensagemEnviado: 26 Out 2013 17:41
por fladimir
Acredito que seja uma configuração no software que gerencia o TEF, deve ter um Timeout ou algo do tipo.

[]´s

Pin pad Gertec PPC 910

MensagemEnviado: 21 Fev 2014 09:12
por frazato
é possivel você me enviar como você fez para utilizar esta dll ( Clisitef) fazendo um favor, tenho que fazer uma rotina para pegar uma trilha de um cartão e solicitar para digitar o número do CFP para nota fiscal paulista.

Desde já agradeço.

Frazato

Pin pad Gertec PPC 910

MensagemEnviado: 17 Mai 2017 09:11
por HASA
:-O
Estou tentando acessar a dll da sitef para implementar TEF em meu sistema algum dos Srs. poderiam ceder algum material a respeito, Dica, PRG etc...
Harbour 3.2 + Minigui Extend + Bcc55
:(
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 17 Mai 2017 09:59
por fladimir
Já tentou o acbr?

Pin pad Gertec PPC 910

MensagemEnviado: 17 Mai 2017 10:53
por HASA
:(
Fladimir, interessante vou dar uma pesquisada, SAT + TEF, obrigado.
:xau
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 17 Mai 2017 11:00
por HASA
:(
Srs. acredito que não soube procurar mas... na ajuda do acbr tem apenas 2 tópicos, para mim bem vagos:

1 - ECF.PreparaTEF

2 - ECF.EfetuaPagamento( cCodFormaPagto, nValor [, cObservacao, bImprimeVinculado ] )

Apesar das explicações contidas lá me parece ser apenas para ECF, e eu queria vincular ao SAT.

:(Neg
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 17 Mai 2017 12:32
por fladimir
Mas quem chama o Pin Pad não é o gerenciador Padrão?

Pin pad Gertec PPC 910

MensagemEnviado: 19 Mai 2017 15:46
por esbasso
Também estou vendo isso, mas exemplo não tem.

As funções são essas da DLL
#include "DLLxHb.ch"
#define DC_CALL_STD 0x0020

STATIC hTefDll

Function Sitef()
Local hDll := LoadLibrary("CliSiTef32I.dll")
SETHandle( hDll ) //hRmcDll)

Return nil

FUNCTION SETHandle( hDll )
hTefDll := hDll
RETURN nil

DLLxHb FUNCTION ConfiguraIntSiTefInterativoEx ( ;
pEnderecoIP, ; //: PAnsiChar; variavel
pCodigoLoja, ; //: PAnsiChar; fixo C 8
pNumeroTerminal, ; //: PAnsiChar; fixo C 8
ConfiguraResultado,; //: smallint fixo 6 000000
ParAdicional; // char variavel
) LIB hTefDll

DLLxHb FUNCTION IniciaFuncaoSiTefInterativo ( ;
Modalidade ,; //: integer; fixo 6
pValor ,; //: PansiChar; varivel com , e duas decimais
pNumeroCuponFiscal ,; //: PansiChar; maximo 20
pDataFiscal,; //: PansiChar; Fixo 8 Data Fiscal no formato AAAAMMDD
pHorario ,; //: PansiChar; Fixo 6 no formato HHMMSS
pOperador ,; //: PansiChar; MAX 20
pRestricoes ; //: PansiChar
) LIB hTefDll

DLLxHb FUNCTION ContinuaFuncaoSiTefInterativo ( ;
@ProximoComando ,; //: Integer;
@TipoCampo ,; // : Integer;
@TamanhoMinimo ,; // : smallint;
@TamanhoMaximo ,; // : smallint;
pBuffer ,; //: PansiChar;
TamMaxBuffer ,; //: Integer;
ContinuaNavegacao ; //: Integer
) LIB hTefDll

DLLxHb FUNCTION FinalizaTransacaoSiTefInterativo ( ;
smallint ,; // : Word; fixo 1 car -1 confirmada 0-estornada
pNumeroCuponFiscal ,; //: PansiChar; max 20
pDataFiscal ,; //: PansiChar;
pHorario ; //: PansiChar
) LIB hTefDll

*- PINPAD
DLLxHb FUNCTION KeepAlivePinPad( ) LIB hTefDll
DLLxHb FUNCTION EscreveMensagemPermanentePinPad (Mensagem) LIB hTefDll // 32 caracteres
// incluir o caractere ‘|’ (Barra em pé) para indicar uma mudança de linha.
DLLxHb FUNCTION LeTrilha3 (Mensagem ) //Esta função permite que o aplicativo capture uma trilha 3 magnética genérica.
*- CARTOA
DLLxHb FUNCTION LeCartaoSeguro (Mensagem) // Mensagem a ser apresentada no visor do PinPad default “PASSE O CARTAO”.
DLLxHb FUNCTION LeSenhaDireto (ChaveSeguranca, SenhaCliente) LIB hTefDll
DLLxHb FUNCTION LeSimNaoPinPad (Mensagem) LIB hTefDll

Agora falta montar o roteiro.

Pin pad Gertec PPC 910

MensagemEnviado: 19 Mai 2017 16:17
por HASA
:-O
É exatamente isso o roteiro, como ? e em que momento? acionar o que ?, estou re-lendo o manual Especificação Técnica – Interface com os meios de pagamento do SiTef - Bibliotecas CliSiTefI e CliSiTef - Versão 189, para começar a rascunhar um PRG, valeu assim mesmo.
:)Pos
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 19 Mai 2017 16:45
por esbasso
INSTALA O SIMULADOR,
exemplo que fiz

#DEFINE CRLF CHR(13)+CHR(10)
Function VendaSitefDemo( )

Sts := 0
ProximoComando := 0
TipoCampo := 0
TamanhoMinimo := 0
TamanhoMaximo := 0
Buffer := SPACE(20000)
Msg := SPACE(22000)
Aux := ""

/* função
0 Pergunta
1 Cheque
2 Cartão de Débito
3 Cartão de Crédito
*/
Sts := IniciaFuncaoSiTefInterativo ( 0, '1,00', '12345', '20101116', '091800','Operador', Nil)
if Sts <> 10000 // 10000 é porque tem mais processamento
return sts
endif

ProximoComando:= 0
TipoCampo:= 0
TamanhoMinimo:= 0
TamanhoMaximo:= 0
Resultado:= 0
DO WHILE sts = 10000 //repeat
Sts := ContinuaFuncaoSiTefInterativo ( @ProximoComando, @TipoCampo, @TamanhoMinimo,;
@TamanhoMaximo, Buffer, Len(Buffer), Resultado )
Aux := CRLF + ' ProximoComando = ' + Ltrim(str(ProximoComando)) +;
' Tipo = ' + Ltrim(str(TipoCampo))
Auxa += Aux + CRLF + Buffer
if Sts = 10000
DO CASE
case ProximoComando = 0 // Está devolvendo um valor para, se desejado, ser armazenado pela automação
case ProximoComando = 1 // Mensagem para o visor do operador
case ProximoComando = 15 // Mostra mensagem em Buffer
msginfo( Buffer )
case ProximoComando = 21 // Deve apresentar um menu de opções e permitir que o usuário selecione uma delas.
ret := MsgGet ( buffer,,,,,)
Resultado := val(ret)
Buffer := ret // "-1" encerra e cancela
case ProximoComando = 22 // Mostra mensagem em Buffer
msginfo( Buffer )
OTHERWISE
Resultado := 0 // outros tipos de Próximo Comando
endCASE
endIF
ENDDO //until Sts <> 10000;

FinalizaTransacaoSiTefInterativo (1,'12345','20101116','091800');

RETURN sts

Estou sem PINPAD para testar leitura de cartão e senha

Pin pad Gertec PPC 910

MensagemEnviado: 19 Mai 2017 17:18
por esbasso
Primeiro comando para o teste

nres := ConfiguraIntSiTefInterativoEx( cip, codigoloja, numeroterminal, configura )

nres := ConfiguraIntSiTefInterativoEx( '127.0.0.1', '00000000', 'SE000001', 0 )

Pin pad Gertec PPC 910

MensagemEnviado: 23 Mai 2017 14:25
por janio
Eu preferi fazer pelo CLIENTE MODULAR (igual o acbr), e não pela dll.

Como tenho muita pratica em troca de arquivos, preferi assim.

Eles te passam um roteiro e vc segue o roteiro. Não eh dificil!

Janio

Pin pad Gertec PPC 910

MensagemEnviado: 23 Mai 2017 23:26
por esbasso
Cliente Modular?
mas qual seria o teu homologador?
SOFTWARE EXPRESS?
Não vi este tipo de opção, somente pela DLL

Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 10:10
por HASA
:{
Obrigado, feras, o que está mais pegando é na verdade para mim tentar montar uma simulação de uso pelo usuário, e interagir com o PinPad como por exemplo cancelar a venda ou digitação porque o cliente do usuário esqueceu a senha, ou ainda, a venda não foi autorizada por isso ou aquilo, agradeço qualquer dica. :(
:(
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 11:34
por HASA
:-O
Basso, uso Harbour 3.2 esse arquivo DLLxHb.ch você pode disponibilizar vou tentar compilar para ver se passa, se alguem souber se tem um arquivo equivalente no Harbour agradeço,
:%
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 11:47
por Kapiaba
Hasa,

// Copyright FiveTech 1993-08  - 2nd version with no data types passed in

// modified by Roger Seiler with FiveTech authorization; this does not require
// any part of FWH and can operate solely with xHarbour.

// DLLxHb.ch - enables using same syntax with xHb's DLLCALL as with FWH's DLL32

#ifndef _DLLxHb_CH
#define _DLLxHb_CH

#define DC_CALL_STD           0 // 0x0020

#translate NOREF([@]<x>) => <x>
//----------------------------------------------------------------------------//

#xcommand DLLxHb FUNCTION <FuncName>( [ <uParam1> ] [, <uParamN>  ] ) ;
             LIB <*DllName*> ;
       => ;
           function <FuncName>( [NOREF(<uParam1>)] [,NOREF(<uParamN>)] ) ;;
             local hDLL := If( ValType( <DllName> ) == "N", <DllName>, LoadLibrary( <(DllName)> ) ) ;;
             local uResult := 0 ;;
             if Abs( hDLL ) > 32 ;;
                uResult = DLLCall( hDLL, DC_CALL_STD, <(FuncName)> [,<uParam1>] [,<uParamN>] ) ;;
                If( ValType( <DllName> ) == "N",, FreeLibrary( hDLL ) ) ;;
             else ;;
             end ;;
          return uResult

// This previous "else" code gpf's, even with FWH...
//                If( ValType( <DllName> ) == "C", <DllName>, Str( <DllName> ) ) ) ;;
//                MsgAlert( "Error code: " + LTrim( Str( hDLL ) ) + " loading " + ;

//----------------------------------------------------------------------------//


abs.

Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 11:55
por HASA
:))
Valeuuu, seguindo em frente
:)Pos
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 14:43
por HASA
:(Neg
Srs. já tentei de tudo mas... o erro persiste.

:'(
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 14:46
por Kapiaba
Easy,

/*
* $Id: dllcall.c,v 1.13 2007/09/25 02:55:30 ronpinkas Exp $
*/

/*
* Harbour Project source code:
* Xbase++ Compatibility functions
* Copyright 2006 Paul Tucker <ptucker@sympatico.ca>
* Additional copyrights below.
*
* See doc/license.txt for licensing terms.
*
* www - http://www.harbour-project.org; http://www.xharbour.org
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option )
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this software; see the file COPYING.   If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/ ).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries with other
* files to produce an executable, this does not by itself cause the
* resulting executable to be covered by the GNU General Public License.
* Your use of that executable is in no way restricted on account of
* linking the Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour.  If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way.   To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*/

/*
* Notes:
*
* I'm not totally familiar with how Xbase++ works.  This functionality was
* derived from the context in which the functions are used.
*
* pt
*
*/

#define _WIN32_WINNT   0x0400
#define  WIN32_LEAN_AND_MEAN

#include "hbapiitm.h"

#if defined( HB_OS_WIN_32 )

#include <windows.h>

#include "hbdll.ch"

#define EXEC_DLL               0x45584543

typedef struct tag_ExecStruct
{
   DWORD     dwType;       // type info
   char *    cDLL;         // DLL
   HINSTANCE hDLL;         // Handle
   char *    cProc;        // Ordinal or Name
   DWORD     dwOrdinal;
   DWORD     dwFlags;      // Calling Flags
   LPVOID    lpFunc;
} EXECSTRUCT, *PEXECSTRUCT;

static PHB_DYNS pHB_CSTRUCTURE = NULL, pPOINTER, pVALUE, pBUFFER, pDEVALUE;

#include "hbapi.h"
#include "hbstack.h"
#include "hbvm.h"

HB_EXTERN_BEGIN
   HB_EXPORT char * hb_parcstruct( int iParam, ... );
HB_EXTERN_END

HB_EXPORT char * hb_parcstruct( int iParam, ... )
{
   HB_THREAD_STUB_ANY

   HB_TRACE(HB_TR_DEBUG, ("hb_parcstruct(%d, ...)", iParam));

   if( pHB_CSTRUCTURE == NULL )
   {
       pHB_CSTRUCTURE = hb_dynsymFind( "HB_CSTRUCTURE" );

       pPOINTER       = hb_dynsymGetCase( "POINTER" );
       pVALUE         = hb_dynsymGetCase( "VALUE" );
       pBUFFER        = hb_dynsymGetCase( "BUFFER" );
       pDEVALUE       = hb_dynsymGetCase( "DEVALUE" );
   }

   if( ( iParam >= 0 && iParam <= hb_pcount() ) || ( iParam == -1 ) )
   {
      PHB_ITEM pItem = ( iParam == -1 ) ? hb_stackReturnItem() : hb_stackItemFromBase( iParam );
      BOOL bRelease = FALSE;

      if( HB_IS_BYREF( pItem ) )
      {
         pItem = hb_itemUnRef( pItem );
      }

      if( HB_IS_ARRAY( pItem ) && ! HB_IS_OBJECT( pItem ) )
      {
         va_list va;
         ULONG ulArrayIndex;
         PHB_ITEM pArray = pItem;

         va_start( va, iParam );
         ulArrayIndex = va_arg( va, ULONG );
         va_end( va );

         pItem = hb_itemNew( NULL );
         bRelease = TRUE;

         hb_arrayGet( pArray, ulArrayIndex, pItem );
      }

      if( strncmp( hb_objGetClsName( pItem ), "C Structure", 11 ) == 0 )
      {
         hb_vmPushSymbol( pVALUE->pSymbol );
         hb_vmPush( pItem );
         hb_vmSend(0);

         if( bRelease )
         {
            hb_itemRelease( pItem );
         }

         return hb_stackReturnItem()->item.asString.value;
      }
   }

   return NULL;
}

static HB_GARBAGE_FUNC( _DLLUnload )
{
   PEXECSTRUCT xec = (PEXECSTRUCT) Cargo;  // provided by decl.

   if ( xec->dwType == EXEC_DLL )
   {
      if ( xec->cDLL != NULL )
      {
         if ( xec->hDLL != (HINSTANCE) 0 )
         {
            FreeLibrary( xec->hDLL );
         }

         hb_xfree( xec->cDLL );
      }

      if ( xec->cProc != NULL )
      {
         hb_xfree( xec->cProc );
      }

      xec->dwType = 0;
   }
}

HB_FUNC( DLLPREPARECALL )
{
   PEXECSTRUCT xec = (PEXECSTRUCT) hb_gcAlloc( sizeof( EXECSTRUCT ), _DLLUnload );

   memset( xec, 0, sizeof( EXECSTRUCT ) );

   if ( ISCHAR( 1 ) )
   {
      xec->cDLL = hb_strdup( hb_parc( 1 ) );
      xec->hDLL = LoadLibrary( xec->cDLL );
   }
   else if (ISNUM( 1 ) )
   {
      xec->hDLL = (HINSTANCE) hb_parnl( 1 );
   }

   if (ISNUM( 2 ) )
   {
      xec->dwFlags = hb_parnl( 2 );
   }
   else
   {
      xec->dwFlags = DC_CALL_STD;
   }

   if ( xec->hDLL )
   {
      if ( ISCHAR( 3 ) )
      {
         // Not a typo - reserving space for possible Ansi 'A' suffix!
         xec->cProc = (char *) hb_xgrab( hb_parclen(3) + 2 );
         strncpy( xec->cProc, hb_parc(3), hb_parclen(3) + 1 );
      }
      else if (ISNUM( 3 ) )
      {
         xec->dwOrdinal = hb_parnl( 3 );
      }
   }
   else
   {
      if( xec->cDLL )
      {
         MessageBox( GetActiveWindow(), "DllPrepareCall:LoadLibrary() failed!", xec->cDLL, MB_OK | MB_ICONERROR );
      }
      else
      {
         MessageBox( GetActiveWindow(), "DllPrepareCall() invalid handle argument!", "DllPrepareCall", MB_OK | MB_ICONERROR );
      }
   }

   xec->dwType = EXEC_DLL;
   xec->lpFunc = (LPVOID) GetProcAddress( xec->hDLL, xec->cProc != NULL ? (LPCSTR) xec->cProc : (LPCSTR) xec->dwOrdinal );

   if( xec->lpFunc == NULL && xec->cProc )
   {
      // try ANSI flavour ?
      xec->cProc[ hb_parclen(3) ] = 'A';
      xec->cProc[ hb_parclen(3) +1  ] = '\0';

      xec->lpFunc = (LPVOID) GetProcAddress( xec->hDLL, xec->cProc != NULL ? (LPCSTR) xec->cProc : (LPCSTR) xec->dwOrdinal );
   }

   if( xec->hDLL && xec->lpFunc )
   {
       hb_retptrGC(  xec );
   }
   else if( xec->hDLL && xec->lpFunc == NULL )
   {
      if( xec->cProc )
      {
         LPVOID lpMsgBuf;

         FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
         FORMAT_MESSAGE_FROM_SYSTEM,
         NULL,
         GetLastError(),
         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
         (LPTSTR) &lpMsgBuf,
         0, NULL );

         MessageBox( GetActiveWindow(), (LPCSTR) lpMsgBuf, "DllPrepareCall:GetProcAddress() failed!", MB_OK | MB_ICONERROR );

         LocalFree(lpMsgBuf);
      }
      else
      {
         MessageBox( GetActiveWindow(), "DllPrepareCall:GetProcAddress() invalid oridnal argument!", "DllPrepareCall", MB_OK | MB_ICONERROR );
      }
   }
}

HB_FUNC( LOADLIBRARY )
{
   hb_retnl( (DWORD) LoadLibraryA( (LPCSTR) hb_parcx( 1 ) ) ) ;
}

HB_FUNC( FREELIBRARY )
{
   hb_retl( FreeLibrary( (HMODULE) hb_parnl( 1 ) ) ) ;
}

// compatibility
HB_FUNC( DLLLOAD )
{
   HB_FUNCNAME( LOADLIBRARY )();
}

// compatibility
HB_FUNC( DLLUNLOAD )
{
   HB_FUNCNAME( FREELIBRARY )();
}

HB_FUNC( GETLASTERROR )
{
   hb_retnl( GetLastError() );
}

HB_FUNC( SETLASTERROR )
{
   hb_retnl( GetLastError() );
   SetLastError( hb_parnl(1) );
}

HB_FUNC( GETPROCADDRESS )
{
   LPVOID lpProcAddr;
   char  cFuncName[MAX_PATH];

   if ((lpProcAddr = (LPVOID) GetProcAddress( (HMODULE) hb_parnl(1),
                                ISCHAR( 2 ) ? (LPCSTR) hb_parcx(2) :
                                              (LPCSTR) hb_parnl(2) )) == 0 )
   {
      if ( ISCHAR( 2 ) )
      {
         // try ANSI flavour ?
         strcpy(cFuncName, hb_parc(2));
         strcat(cFuncName, "A");
         lpProcAddr = (LPVOID) GetProcAddress((HMODULE) hb_parnl(1), cFuncName);
      }
   }

   hb_retptr( lpProcAddr );
}

//==================================================================
// See DynaCall support comments below

#define DC_CALL_STD_BO         (DC_CALL_STD | DC_BORLAND)
#define DC_CALL_STD_MS         (DC_CALL_STD | DC_MICROSOFT)
#define DC_CALL_STD_M8         (DC_CALL_STD | DC_RETVAL_MATH8)

#define DC_FLAG_ARGPTR         0x00000002

#define CTYPE_VOID 0
#define CTYPE_CHAR 1

#define CTYPE_UNSIGNED_CHAR -1
#define CTYPE_CHAR_PTR 10
#define CTYPE_UNSIGNED_CHAR_PTR -10

#define CTYPE_SHORT 2
#define CTYPE_UNSIGNED_SHORT -2
#define CTYPE_SHORT_PTR 20
#define CTYPE_UNSIGNED_SHORT_PTR -20

#define CTYPE_INT 3
#define CTYPE_UNSIGNED_INT -3
#define CTYPE_INT_PTR 30
#define CTYPE_UNSIGNED_INT_PTR -30

#define CTYPE_LONG 4
#define CTYPE_UNSIGNED_LONG -4
#define CTYPE_LONG_PTR 40
#define CTYPE_UNSIGNED_LONG_PTR -40

#define CTYPE_FLOAT 5
#define CTYPE_FLOAT_PTR 50

#define CTYPE_DOUBLE 6
#define CTYPE_DOUBLE_PTR 60

#define CTYPE_VOID_PTR 7

#define CTYPE_BOOL 8

#define CTYPE_STRUCTURE 1000
#define CTYPE_STRUCTURE_PTR 10000

#pragma pack(1)

typedef union RESULT {          // Various result types
    int     Int;                // Generic four-byte type
    long    Long;               // Four-byte long
    void   *Pointer;            // 32-bit pointer
    float   Float;              // Four byte real
    double  Double;             // 8-byte real
    __int64 int64;              // big int (64-bit)
} RESULT;

typedef struct DYNAPARM {
    DWORD       dwFlags;        // Parameter flags
    int         nWidth;         // Byte width
    union {                     //
            BYTE    bArg;          // 1-byte argument
            SHORT   usArg;         // 2-byte argument
            DWORD   dwArg;         // 4-byte argument
            double  dArg;
          };
    void   *pArg;           // Pointer to argument
} DYNAPARM;

#pragma pack()

RESULT DynaCall(int Flags, LPVOID lpFunction, int nArgs,
                DYNAPARM Parm[], LPVOID pRet, int nRetSiz);
//
//==================================================================

// Based originally on CallDLL from What32
static void DllExec( int iFlags, LPVOID lpFunction, int iParams, int iFirst, int iArgCnt, PEXECSTRUCT xec )
{
   int iRtype;
   int iCnt = 0;
//   int iCmode;
   int i;
   DYNAPARM   Parm[15];
   RESULT     rc;

   if( xec )
   {
      iFlags     = xec->dwFlags;
      lpFunction = xec->lpFunc;

      //TODO Params maybe explictly specified in xec!
   }

//   iCmode = iFlags & 0xf000;  // Unsupported Mode (specifies XBase++ Function1)
   iRtype = iFlags & 0x0f00;  // Return type - An additional flag over XBase++
   iFlags = iFlags & 0x00ff;  // Calling Convention

   if ( iRtype == 0 )
   {
      iRtype = CTYPE_UNSIGNED_LONG;
   }

   memset( Parm, 0, sizeof( Parm ) );

   if( iArgCnt > 0)
   {
      for( i = iFirst; i <= iParams; i++)
      {
         switch ( hb_parinfo( i ) & ~HB_IT_BYREF )
         {
            case HB_IT_NIL               :
               Parm[iCnt].nWidth = sizeof( void * );
               Parm[iCnt].dwArg = (DWORD) NULL;
               break;

            case HB_IT_POINTER           :
               Parm[iCnt].nWidth = sizeof( void * );
               Parm[iCnt].dwArg = (DWORD) hb_parptr ( i );
               break;

            case HB_IT_INTEGER           :
            case HB_IT_LONG              :
            case HB_IT_DATE              :
            case HB_IT_LOGICAL           :
               Parm[iCnt].nWidth = sizeof( DWORD );
               Parm[iCnt].dwArg = (DWORD) hb_parnl( i );

               if( hb_parinfo( i ) & HB_IT_BYREF )
               {
                  Parm[iCnt].pArg   = &( Parm[iCnt].dwArg );
                  Parm[iCnt].dwFlags = DC_FLAG_ARGPTR;  // use the pointer
               }
               break;

            case HB_IT_DOUBLE            :
               Parm[iCnt].nWidth = sizeof( double );
               Parm[iCnt].dArg = hb_parnd( i );

               if( hb_parinfo( i ) & HB_IT_BYREF )
               {
                  Parm[iCnt].nWidth = sizeof( void * );
                  Parm[iCnt].pArg   = &( Parm[iCnt].dArg );
                  Parm[iCnt].dwFlags = DC_FLAG_ARGPTR;  // use the pointer
               }

               iFlags |= DC_RETVAL_MATH8;
               break;

            case HB_IT_STRING            :
            case HB_IT_MEMO              :
               Parm[iCnt].nWidth = sizeof( void * );

               if ( hb_parinfo( i ) & HB_IT_BYREF )
               {
                  Parm[iCnt].pArg = malloc( hb_parclen( i ) );
                  memcpy( Parm[iCnt].pArg, hb_parc( i ), hb_parclen( i ) );
               }
               else
               {
                  Parm[iCnt].pArg = (void *) hb_parc( i );
               }

               Parm[iCnt].dwFlags = DC_FLAG_ARGPTR;  // use the pointer
               break;

            case HB_IT_ARRAY             :
               if( strncmp( hb_objGetClsName( hb_param(i, HB_IT_ANY ) ), "C Structure", 11 ) == 0 )
               {
                  Parm[iCnt].nWidth = sizeof(  void * );
                  Parm[iCnt].dwArg = (DWORD) hb_parcstruct( i );
                  break;
               }

            default:
               MessageBox( GetActiveWindow(), "UNKNOWN Parameter Type!", "DLLCall Parameter Error!", MB_OK | MB_ICONERROR );
               return;
         }

         iCnt++;
      }
   }

   /*SetLastError(0);*/
   rc = DynaCall(iFlags, lpFunction, iArgCnt, Parm, NULL, 0);

   /*if( GetLastError() )
   {
      LPVOID lpMsgBuf;

      FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
      FORMAT_MESSAGE_FROM_SYSTEM,
      NULL,
      GetLastError(),
      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
      (LPTSTR) &lpMsgBuf,
      0, NULL );

      MessageBox( GetActiveWindow(), (LPCSTR) lpMsgBuf, "DllExec:DynaCall() failed!", MB_OK | MB_ICONERROR );

      LocalFree(lpMsgBuf);
   }*/

   if( iArgCnt > 0)
   {
      iCnt = 0;

      for( i = iFirst; i <= iParams; i++)
      {
         if( hb_parinfo( i ) & HB_IT_BYREF )
         {
            switch ( hb_parinfo( i ) & ~HB_IT_BYREF )
            {
               case HB_IT_NIL               :
                  hb_stornl( Parm[iCnt].dwArg, i );
                  break;

               case HB_IT_POINTER           :
                  break;

               case HB_IT_INTEGER           :
               case HB_IT_LONG              :
               case HB_IT_DATE              :
               case HB_IT_LOGICAL           :
                  hb_stornl( *(LONG *) ( Parm[iCnt].pArg ), i );
                  break;

               case HB_IT_DOUBLE            :
                  hb_stornd( *(double *) &( Parm[iCnt].dArg ), i );
                  break;

               case HB_IT_STRING            :
               case HB_IT_MEMO              :
                  hb_storclen( (char *) Parm[iCnt].pArg, hb_parclen( i ), i );
                  free( Parm[iCnt].pArg );
                  break;

               case HB_IT_ARRAY             :
                  if( strncmp( hb_objGetClsName( hb_param(i, HB_IT_ANY ) ), "C Structure", 11 ) == 0 )
                  {
                     hb_vmPushSymbol( pDEVALUE->pSymbol );
                     hb_vmPush( hb_param( i, HB_IT_ANY ) );
                     hb_vmSend(0);

                     break;
                  }

               default:
                  MessageBox( GetActiveWindow(), "UNKNOWN Parameter Type!", "DLLCall Parameter Error!", MB_OK | MB_ICONERROR );
                  return;
            }
         }

         iCnt++;
      }
   }

   // return the correct value
   switch ( iRtype )
   {
      case CTYPE_BOOL :
         hb_retl( (BOOL) rc.Long );
         break;

      case CTYPE_VOID :
         hb_retni(0);
         break;

      case CTYPE_CHAR              :
      case CTYPE_UNSIGNED_CHAR     :
         hb_retni ( (char) rc.Int );
         break;

      case CTYPE_SHORT             :
      case CTYPE_UNSIGNED_SHORT    :
         hb_retni ( (int) rc.Int );
         break;

      case CTYPE_INT               :
         hb_retni ( (int) rc.Long );
         break;

      case CTYPE_LONG              :
         hb_retnl ( (LONG) rc.Long );
         break;

      case CTYPE_CHAR_PTR          :
      case CTYPE_UNSIGNED_CHAR_PTR :
         hb_retc ( (char *) rc.Long );
         break;

      case CTYPE_UNSIGNED_INT      :
      case CTYPE_UNSIGNED_LONG     :
         hb_retnl ( rc.Long );
         break;

      case CTYPE_INT_PTR           :
      case CTYPE_UNSIGNED_SHORT_PTR:
      case CTYPE_UNSIGNED_INT_PTR  :
      case CTYPE_STRUCTURE_PTR     :
      case CTYPE_LONG_PTR          :
      case CTYPE_UNSIGNED_LONG_PTR :
      case CTYPE_VOID_PTR          :
      case CTYPE_FLOAT_PTR         :
      case CTYPE_DOUBLE_PTR        :
         hb_retptr ( (void *) rc.Long );
         break;

      case CTYPE_FLOAT             :
         hb_retnd( rc.Float );
         break;

      case CTYPE_DOUBLE            :
         hb_retnd( rc.Double );
         break;

      default:
         MessageBox( GetActiveWindow(), "Unknown return type!", "DLLCall Parameter Error!", MB_OK | MB_ICONERROR );
         break;
   }
}

//------------------------------------------------------------------

HB_FUNC( DLLEXECUTECALL )
{
   int iParams = hb_pcount();
   int iFirst  = 2;
   int iArgCnt = iParams - 1;
   PEXECSTRUCT xec = (PEXECSTRUCT) hb_parptr(1);

   if ( xec != NULL )
   {
      if ( xec->dwType == EXEC_DLL )
      {
         if ( xec->hDLL != (HINSTANCE) NULL )
         {
            if ( xec->lpFunc != NULL )
            {
               DllExec( 0, NULL, iParams, iFirst, iArgCnt, xec );
            }
         }
      }
   }
}

HB_FUNC( DLLCALL )
{
   int iParams = hb_pcount();
   int iFirst = 4;
   int iArgCnt = iParams - 3;
   int iFlags;
   BOOL lUnload = FALSE;
   HINSTANCE  hInst;
   LPVOID     lpFunction;
   BYTE       cFuncName[MAX_PATH];

   if ( ISCHAR(1) )
   {
      hInst = LoadLibrary( hb_parc( 1 ) );
      lUnload = TRUE;
   }
   else
   {
      hInst = (HINSTANCE) hb_parnl( 1 );
   }

   if ( hInst == NULL || (DWORD) hInst < 32)
   {
      hb_ret();
      return;
   }

   iFlags = hb_parni( 2 );

   if ((lpFunction = (LPVOID) GetProcAddress( (HMODULE) hInst,
                                ISCHAR( 3 ) ? (LPCSTR) hb_parcx(3) :
                                              (LPCSTR) hb_parnl(3) )) == 0 )
   {
      if ( ISCHAR( 3 ) )
      {
         // try forced ANSI flavour ?
         strcpy((char *) cFuncName, hb_parc(3));
         strcat((char *) cFuncName, "A");
         lpFunction = (LPVOID) GetProcAddress( (HMODULE) hInst, (const char *) cFuncName);
      }
   }

   if (lpFunction != NULL)
   {
      DllExec( iFlags, lpFunction, iParams, iFirst, iArgCnt, NULL );
   }

   if ( lUnload )
   {
      FreeLibrary( hInst );
   }
}

//------------------------------------------------------------------
// DynaCall support comments below
//////////////////////////////////////////////////////
//
//   This part used modified code of Vic McClung.
//   The modifications were to separate the library
//   loading and getting the procedure address
//   from the actual function call.
//   The parameters have been slightly re-arranged
//   to allow for C-like syntax, on function
//   declaration. The changes allow to load the library
//   and to get the procedure addresses in advance,
//   which makes it work similarly to C import libraries.
//   From experience, when using dynamic libraries, loading
//   the library and getting the address of the procedure
//   part of using the DLL.
//   Additionally the changes will allow to use standard
//   xHarbour C type defines, as used with structure types,
//   ande defined in cstruct.ch .
//
//
//   Andrew Wos.
//   20/07/2002.
//
//
//////////////////////////////////////////////////////

/*

Copyright 2002 Vic McClung <vicmcclung@vicmcclung.com>
www - http://www.vicmcclung.com

Borland mods by ptucker@sympatico.ca
MinGW support by Phil Krylov <phil a t newstar.rinet.ru>

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this software; see the file COPYING.  If not, write to
the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).

As a special exception, you have permission for
additional uses of the text contained in this release of VMGUI.

The exception is that, if you link the VMGUI library with other
files to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public License.
Your use of that executable is in no way restricted on account of
linking the VMGUI library code into it.

*/

//------------------------------------------------------------------

//------------------------------------------------------------------

RESULT DynaCall(int Flags,       LPVOID lpFunction, int nArgs,
                DYNAPARM Parm[], LPVOID pRet,      int nRetSiz)
{
   // Call the specified function with the given parameters. Build a
   // proper stack and take care of correct return value processing.
   RESULT  Res = { 0 };
   int    i, nInd, nSize, nLoops;
   DWORD   dwEAX, dwEDX, dwVal, *pStack, dwStSize = 0;
   BYTE   *pArg;

   #if defined( __MINGW32__ )
   #elif defined( __BORLANDC__ ) || defined(__DMC__)
   #else
      DWORD *pESP;
   #endif

   // Reserve 256 bytes of stack space for our arguments
   #if defined( __MINGW32__ )
      asm volatile( "\tmovl %%esp, %0\n"
                    "\tsubl $0x100, %%esp\n"
                    : "=r" (pStack) );
   #elif defined( __BORLANDC__ ) || defined(__DMC__)
      pStack = (DWORD *)_ESP;
      _ESP -= 0x100;
   #else
      _asm mov pStack, esp
      _asm mov pESP, esp
      _asm sub esp, 0x100
   #endif

   // Push args onto the stack. Every argument is aligned on a
   // 4-byte boundary. We start at the rightmost argument.
   for (i = 0; i < nArgs; i++)
   {
      nInd  = (nArgs - 1) - i;
      // Start at the back of the arg ptr, aligned on a DWORD
      nSize = (Parm[nInd].nWidth + 3) / 4 * 4;
      pArg  = (BYTE *) Parm[nInd].pArg + nSize - 4;
      dwStSize += (DWORD) nSize; // Count no of bytes on stack

      nLoops = ( nSize / 4 ) - 1;

      while( nSize > 0 )
      {
         // Copy argument to the stack
         if( Parm[nInd].dwFlags & DC_FLAG_ARGPTR )
         {
            // Arg has a ptr to a variable that has the arg
            dwVal = (DWORD) pArg; // Get first four bytes
            pArg -= 4;           // Next part of argument
         }
         else
         {
            // Arg has the real arg
            dwVal = *( (DWORD *)( (BYTE *) ( &( Parm[nInd].dwArg ) ) + ( nLoops * 4 ) ) );
         }

         // Do push dwVal
         pStack--;         // ESP = ESP - 4
         *pStack = dwVal;   // SS:[ESP] = dwVal
         nSize -= 4;
         nLoops--;
      }
   }

   if ((pRet != NULL) && ((Flags & DC_BORLAND) || (nRetSiz > 8)))
   {
      // Return value isn't passed through registers, memory copy
      // is performed instead. Pass the pointer as hidden arg.
      dwStSize += 4;        // Add stack size
      pStack--;            // ESP = ESP - 4
      *pStack = (DWORD)pRet;  // SS:[ESP] = pMem
   }
   #if defined( __MINGW32__ )
      asm volatile( "\taddl $0x100, %%esp\n" /* Restore to original position */
                    "\tsubl %2, %%esp\n"     /* Adjust for our new parameters */

                    /* Stack is now properly built, we can call the function */
                    "\tcall *%3\n"
                    : "=a" (dwEAX), "=d" (dwEDX) /* Save eax/edx registers */
                    : "r" (dwStSize), "r" (lpFunction) );

      /* Possibly adjust stack and read return values. */
      if (Flags & DC_CALL_CDECL)
      {
         asm volatile( "\taddl %0, %%esp\n" : : "r" (dwStSize) );
      }

      if (Flags & DC_RETVAL_MATH4)
      {
         asm volatile( "\tfstps (%0)\n" : "=r" (Res) );
      }
      else if (Flags & DC_RETVAL_MATH8)
      {
         asm volatile( "\tfstpl (%0)\n" : "=r" (Res) );
      }
      else if (pRet == NULL)
      {
         Res.Int = dwEAX;
         (&Res.Int)[1] = dwEDX;
      }
      else if (((Flags & DC_BORLAND) == 0) && (nRetSiz <= 8))
      {
         /* Microsoft optimized less than 8-bytes structure passing */
         ((int *)pRet)[0] = dwEAX;
         ((int *)pRet)[1] = dwEDX;
      }
   #elif defined( __BORLANDC__ ) || defined(__DMC__)
      _ESP += (0x100 - dwStSize);
      _EDX =  (DWORD) &lpFunction;
      __emit__(0xff,0x12); // call [edx];
      dwEAX = _EAX;
      dwEDX = _EDX;

      // Possibly adjust stack and read return values.
      if (Flags & DC_CALL_CDECL)
      {
         _ESP += dwStSize;
      }

      if (Flags & DC_RETVAL_MATH4)
      {
         _EBX = (DWORD) &Res;
         _EAX = dwEAX;
         _EDX = dwEDX;
         __emit__(0xd9,0x1b);   //     _asm fnstp float ptr [ebx]
      }
      else if (Flags & DC_RETVAL_MATH8)
      {
         _EBX = (DWORD) &Res;
         _EAX = dwEAX;
         _EDX = dwEDX;
         __emit__(0xdd,0x1b);   //     _asm fnstp qword ptr [ebx]
      }
      else if (pRet == NULL)
      {
         _EBX = (DWORD) &Res;
         _EAX = dwEAX;
         _EDX = dwEDX;
//         _asm mov DWORD PTR [ebx], eax
//         _asm mov DWORD PTR [ebx + 4], edx
         __emit__(0x89,0x03,0x89,0x53,0x04);
      }
      else if (((Flags & DC_BORLAND) == 0) && (nRetSiz <= 8))
      {
         _EBX = (DWORD) pRet;
         _EAX = dwEAX;
         _EDX = dwEDX;
//         _asm mov DWORD PTR [ebx], eax
//         _asm mov DWORD PTR [ebx + 4], edx
         __emit__(0x89,0x03,0x89,0x53,0x04);
      }
   #else
      _asm add esp, 0x100       // Restore to original position
      _asm sub esp, dwStSize     // Adjust for our new parameters

      // Stack is now properly built, we can call the function
      _asm call [lpFunction]

      _asm mov dwEAX, eax       // Save eax/edx registers
      _asm mov dwEDX, edx       //

      // Possibly adjust stack and read return values.
      if (Flags & DC_CALL_CDECL)
      {
         _asm add esp, dwStSize
      }

      if (Flags & DC_RETVAL_MATH4)
      {
         _asm fstp dword ptr [Res]
      }
      else if (Flags & DC_RETVAL_MATH8)
      {
         _asm fstp qword ptr [Res]
      }
      else if (pRet == NULL)
      {
         _asm mov eax, [dwEAX]
         _asm mov DWORD PTR [Res], eax
         _asm mov edx, [dwEDX]
         _asm mov DWORD PTR [Res + 4], edx
      }
      else if (((Flags & DC_BORLAND) == 0) && (nRetSiz <= 8))
      {
         // Microsoft optimized less than 8-bytes structure passing
         _asm mov ecx, DWORD PTR [pRet]
         _asm mov eax, [dwEAX]
         _asm mov DWORD PTR [ecx], eax
         _asm mov edx, [dwEDX]
         _asm mov DWORD PTR [ecx + 4], edx
      }

      _asm mov esp, pESP
   #endif

   return Res;
}

//
// Call a DLL function from (x)Harbour, the first parameter is a pointer returned from
// GetProcAddress above. Note that it is hardcoded to use PASCAL calling convention.
//

HB_FUNC( CALLDLL )
{
   int iParams = hb_pcount();
   int iFirst = 2;
   int iArgCnt = iParams - 1;
   LPVOID     lpFunction;

   lpFunction = (LPVOID) hb_parptr( 1 );
   if (lpFunction != NULL)
   {
      DllExec( DC_CALL_STD, lpFunction, iParams, iFirst, iArgCnt, NULL );
   }

}

#endif /* HB_OS_WIN32 */


Abs.

Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 14:50
por Kapiaba
// Seria +- assim usando a dll QRCodelib.Dll

FUNCTION GERAR_QRCode()

   LOCAL cStr, cFile

   cStr:="conteúdo do_qrcode"

   cFile:="c:\arq.bmp"

   QRcode(cStr,cFile)

RETURN NIL

FUNCTION QRcode( cStr, cFile )

   #Define DC_CALL_STD  0x0020

   LOCAL qrDLL

   Generar_QR( cStr, cFile )

RETURN(NIL)

FUNC Generar_QR( cStr, cFile )

   LOCAL nResp
   LOCAL qrDLL

   qrDLL:=LoadLibrary("QRCodelib.Dll" )

   nResp:=DllCall(qrDLL,DC_CALL_STD,"FastQRCode",cStr,cFile)

   FreeLibrary(qrDLL)

RETURN NIL

Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 14:56
por Kapiaba

Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 16:23
por HASA
:%
Kapi, depois de muitos ajustes, não consegui resolver essa função DllExec( ), diz não existir, lembrando que é harbour 3.2 ela deve ser do X, deve ter uma equivalente mas não localizei, já tentei nos foruns mais populares mas... não deu.
:(Neg
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 16:59
por esbasso
O Include esta ali

// Copyright FiveTech 1993-08  - 2nd version with no data types passed in

// modified by Roger Seiler with FiveTech authorization; this does not require
// any part of FWH and can operate solely with xHarbour.

// DLLxHb.ch - enables using same syntax with xHb's DLLCALL as with FWH's DLL32

#ifndef _DLLxHb_CH
#define _DLLxHb_CH

#define DC_CALL_STD           0 // 0x0020

#translate NOREF([@]<x>) => <x>
//----------------------------------------------------------------------------//

#xcommand DLLxHb FUNCTION <FuncName>( [ <uParam1> ] [, <uParamN>  ] ) ;
             LIB <*DllName*> ;
       => ;
           function <FuncName>( [NOREF(<uParam1>)] [,NOREF(<uParamN>)] ) ;;
             local hDLL := If( ValType( <DllName> ) == "N", <DllName>, LoadLibrary( <(DllName)> ) ) ;;
             local uResult := 0 ;;
             if Abs( hDLL ) > 32 ;;
                uResult = DLLCall( hDLL, DC_CALL_STD, <(FuncName)> [,<uParam1>] [,<uParamN>] ) ;;
                If( ValType( <DllName> ) == "N",, FreeLibrary( hDLL ) ) ;;
             else ;;
             end ;;
          return uResult

// This previous "else" code gpf's, even with FWH...
//                If( ValType( <DllName> ) == "C", <DllName>, Str( <DllName> ) ) ) ;;
//                MsgAlert( "Error code: " + LTrim( Str( hDLL ) ) + " loading " + ;

//----------------------------------------------------------------------------//


Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 17:08
por Kapiaba
DllExec()? Não seria DllExeutecall() ??

aff:

https://www.mail-archive.com/harbour@harbour-project.org/msg02583.html

Se eu entendi, o Harbour tem:

http://www.vouch.info/harbour/index.html?hbw32.htm

Porque não compilas com o xHarbour, e depois, se funcionar, cambias a Harbour? Harbour em minha modesta opinião, é dificil d++++, kkkkkkkkkkkkkkkkkk, Mas, é só o meu gosto pessoal.

Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 17:21
por HASA
:?
Kapi, na anti-penúltima linha do fonte que você disponibilizou e que estou tentando compilar é que tem essa chamada veja : http://www.pctoledo.com.br/forum/viewtopic.php?f=4&t=14575&p=116198#p116191
:xau

Vou analisar esse seu novo post ok.

HASA

Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 17:27
por HASA
:%
Vixi acho que entendi isso está em C
:'(
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 24 Mai 2017 17:58
por HASA
:(Neg :%
- Desisto, fiz 200 compilações, coloquei tirei, mas a função DLLCALL não está sendo localizada, inclui a dll.lib e a calldll.lib como pode não aparecer,
fui...
:-[
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 25 Mai 2017 09:21
por esbasso
DllCall é uma função normal que consta no Help
esta dentro de
Source: rtl\dllcall.c

No HARBOUR deve ter ou uma similar, se tem outro nome é só trocar

Pin pad Gertec PPC 910

MensagemEnviado: 25 Mai 2017 10:29
por JoséQuintas
Desisto, fiz 200 compilações, coloquei tirei, mas a função DLLCALL não está sendo localizada


Isso é coisa do xHarbour, se é que no xHarbour existe.

No Harbour 3.2 e 3.4, tem aquela xhb.hbc, que é LIB de compatibilidade com xHarbour.
Lá tem uma CallDll(). NÃO USE ESSA, pelo que dá pra ver, nem no xHarbour gostam do que é do xHarbour.

No Harbour 3.2 e 3.4 tem hb_DyCall(), função no core do Harbour, pra Windows ou Linux.

No Harbour 3.2 tem CallDll32() que no Harbour 3.4 foi renomeada pra CallDll() em hbmisc.hbc

Como exemplo de uso de DLL, a do RMChart pode ser interessante quando se tem muitas funções na DLL.

CREATE CLASS RmChart

   VAR    nHandle

   METHOD New()                            INLINE ::nHandle := hb_libLoad( "RMChart.dll" ), SELF
   METHOD Destroy()                        INLINE hb_libFree( ::nHandle )
   METHOD AddBarSeries(a,b,c, ... )        INLINE ::CallDllStd( "RMC_ADDBARSERIES", a, b, ::ToDouble( c ), ... )
   METHOD CallDllStd( cName, ... )         INLINE hb_DynCall( { cName, ::nHandle, HB_DYN_CALLCONV_STDCALL }, ... )
   END CLASS


Trata-se apenas de carregar a DLL, liberar no final, e montar as chamadas à DLL.
O IMPORTANTÍSSIMO é que os tipos passados/retornados tem que ser compatíveis, senão é GPF.

Se no xHarbour não der pra fazer igual, tão perdendo tempo com ele.

Pin pad Gertec PPC 910

MensagemEnviado: 25 Mai 2017 10:41
por esbasso
Esta confundindo
Eu postei o exemplo do TEF em xHarbour
Quem não está conseguindo fazer é o que usa o Harbour

Tenho todas as funções do RMCHart no xHarbour e funciona muito bem

No caso do Sitef não tem nenhum problema com os parâmetros ao contrario do RMChart que é preciso converter alguns.

Pin pad Gertec PPC 910

MensagemEnviado: 25 Mai 2017 10:55
por HASA
:-o
Bom dia, no caso estou tentando pegar o exemplo do Basso que está em Xharbour e compilar com o Harbour 3.2 que vem junto com a Minigui Extend usando Brmake, minha intensão era criar um pequeno aplicativo como exemplo de uso para disponibilizar aos colegas já que consegui um PinPad emprestado, tenho somente 40 dias para devolve-lo e estou correndo para criar, testar e disponibilizar algum material INEDITO sobre TEF pois não localzei nada que realmente ajude quem está começando, se conseguirem compilar o exemplo do Basso em Harbour 3.2 disponibilizem os fontes que vou migrar para Minigui Extend ok.
8-|
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 25 Mai 2017 12:07
por JoséQuintas
Esta confundindo
Eu postei o exemplo do TEF em xHarbour
Quem não está conseguindo fazer é o que usa o Harbour
Tenho todas as funções do RMCHart no xHarbour e funciona muito bem
No caso do Sitef não tem nenhum problema com os parâmetros ao contrario do RMChart que é preciso converter alguns.


Então em Harbour, que pode ser ajustado pra xHarbour, igual do RMChart:
(Fiz agora, pode conter erros, é bom confirmar)

CREATE CLASS TefDllClass

   VAR    nHandle

   METHOD New()                      INLINE ::nHandle := hb_libLoad( "CliSiTef32i.dll" ), SELF
   METHOD Destroy()                  INLINE hb_libFree( ::nHandle )
   METHOD Configura( ... )           INLINE ::CallDllStd( "ConfiguraIntSiTefInterativoEx", ... )
   METHOD Inicia( ... )              INLINE ::CallDllStd( "IniciaFuncaoSiTefInterativo", ... )
   METHOD Continua( ... )            INLINE ::CallDllStd( "ContinuaFuncaoSiTefInterativo", ... )
   METHOD Finaliza( ... )            INLINE ::CallDllStd( "FinalizaTransacaoSiTefInterativo", ... )
   METHOD KeepAlive()                INLINE ::CallDllStd( "KeepAlivePinPad", ... )
   METHOD Escreve( ... )             INLINE ::CallDllStd( "EscreveMensagemPermanentePinPad", ... )
   METHOD LeTrilha( ... )            INLINE ::CallDllStd( "LeTrilha3", ... )
   METHOD LeCartao( ... )            INLINE ::CallDllStd( "LeCartaoSeguro", ... )
   METHOD LeSenha( ... )             INLINE ::CallDllStd( "LeSenhaDireto", ... )
   METHOD LeSimNaoPinPad( ... )      INLINE ::CallDllStd( "LeSimNaoPinPad", ... )
   METHOD CallDllStd( cName, ... )   INLINE hb_DynCall( { cName, ::nHandle, HB_DYN_CALLCONV_STDCALL }, ... )
   END CLASS

Pin pad Gertec PPC 910

MensagemEnviado: 25 Mai 2017 12:26
por JoséQuintas
Lembrando que o HBMK2 tem a opção de pesquisar em tudo que é LIB...

Dá pra ver HMG_CallDll() na HMG Extended, OOHG, HMG3 e "talvez" CallFunc() na HWGui
E tem até __fox_DynCall() na hbfoxpro.hbc e DllCall() em hbxpp.hbc
Além das que já mencionei, CallDll(), CallDll32(), e hb_DynCall()
A preferência é sempre pra funções do núcleo do Harbour.

hbmk2.png

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 09:23
por janio
Cliente Modular?
mas qual seria o teu homologador?
SOFTWARE EXPRESS?
Não vi este tipo de opção, somente pela DLL


Basso!

Minha homologadora eh a SOFTWARE EXPRESS, e faço através da SkyTEF.

Sim, existe o CLIENTE MODULAR que funciona exatamente como o ACBrMonitor. Vc fica trocando arquivos TEXTO com ele. Cria o comando numa pasta, e espera o retorno em outra pasta. MUUUUUITO FACIL. O monitor deles (Sitef) fica rodando escondido no tray.

Eu achei muuuuuito mais facil e simples do que com a dll. Desenvolvi em poucos dias.

Eh so vc pedir o material pra fazer pelo cliente modular q eles te mandam sem problema. Inclusive acabaram de me mandar pq vou precisar re-homologar para impressora nao fiscal.

Janio

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 10:24
por HASA
Janio, abusando só um pouquinho tens um pequeno demo com acbr ?
:)´
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 10:47
por HASA
:-O
- Jânio inclusive no fórum do acbr não localizo nada a respeito acredito que sua ajuda possa ser muito valiosa.

- Veja no link abaixo outro colega procurando por informações:

http://www.projetoacbr.com.br/forum/topic/18458-nfc-e-pagamento-por-cartao/#comment-210500

8-|

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 10:57
por janio
Hasa,

Nao uso ACBr para o TEF. Faço na unha mesmo. O que eu disse foi que o uso do CLIENTE MODULAR é SEMELHANTE ao uso do ACBr, ou seja, vai arquivo e vem arquivo (troca).

Aliás, não ha necessidade de ficar 'amarrado' ao acbr para isso hehehe

O uso é simples:
ComandoTEF( { "000-000 = CRT" ,;
"001-000 = " + nIdentifiTEF ,;
"002-000 = " + AllTrim(Str(vNUMCOO)) ,;
"003-000 = " + AllTrim( Trans( vValorTEF, '@E 999999999.99' ) ) ,;
"004-000 = 0" ,;
"210-084 = " + "CRIASOFT10" ,;
"701-034 = 4" ,;
"999-999 = 0" } )

If !VerificaArqStatusTef()
msg("tef nao responde")
Return .f.
Endif


Vc manda um arquivo e aguarda a resposta dele. Simples

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 11:21
por HASA
:{ :)Pos

- Captei, estou bem no inicio e vendo para onde a maré vai me levar não decidi ainda, troca de arquivos, dll, e o que pintar vou testando, valeu mesmo por essa dica de start, se mais alguem utilizar outro modo de comunicar-se com a SiTef agradeço qualquer dica.
:{

HASA

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 11:52
por janio
Hasa,

Ha dois anos eu tambem estava perdido qndo precisei implementar isso 'pra ontem' num cliente. A demora foi entender como tudo funciona! Depois q entendi o processo, foi rapido.

Com cliente modular eu fiz em menos de uma semana. E mais: em mais de 2 anos de uso, nunca tive um so problema com TEF. O negocio eh bem feito.

Eu fiz parceria com a SkyTEF, eles passaram um roteiro e os arquivos necessários. Duvidas fui tirando com eles...

Se interessar fazer pelo cliente modular, posso passar as funções q fiz para troca de arquivos...

Janio

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 12:59
por HASA
:)) :D

Jânio, como disse meu barquinho não chegou em lugar algum, com esse seu depoimento acima de a 2 anos não ter tido problemas me animou muuuiiiitttooo já que estou rodando no meio desse lago, se jogares a boia agradeço.
:-´ :-Y
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 13:47
por janio
PhTEF     := 'C:\Client'
PhTEFreq  := 'C:\Client\Req\'
PhTEFres  := 'C:\Client\Resp\'

TefReq       := 'IntPos.001'
TefRes       := 'IntPos.001'
TefTmp      := 'IntPos.TMP'
TefSts       := 'IntPos.Sts'

Function ComandoTEF( VET_PARAM, ESPERA )
Local RET_IMP, REQ, RESP, TEMPOR, TINI, tFIM, Tef_Handle, BYTES, I, TIPO_PARAM

DEFAULT VET_PARAM   to {} ,;
        ESPERA      to 3600

REQ    := PhTEFreq + TefReq
RESP   := PhTEFres + TefRes
TEMPOR := PhTEFreq + TefTmp

// apaga requisição anterior
tFIM := seconds() + 3
Do while hb_FileExists( REQ )

   fErase( TEMPOR )
   
   If fErase( REQ ) = -1
      If (seconds() > tFIM)
         RET_IMP := 'ERRO: Nao foi possivel apagar o arquivo: ('+REQ+') '+;
         ErrorOsMessage(ferror())
      Else
         millisec(20)
      EndIf
   EndIf
     
Enddo

Tef_Handle := FCreate( TEMPOR )

For I := 1 to Len(VET_PARAM)

   fWriteLine( Tef_Handle, VET_PARAM[I] )

Next

fClose(Tef_Handle)
Millisec(100)

Do while Empty(RET_IMP)

   If fRename(TEMPOR, REQ) = -1
      RET_IMP := 'ERRO: Nao foi possivel renomear ('+TEMPOR+') para ('+REQ+') '+;
      ErrorOsMessage(ferror())
   EndIf

Enddo

Return .t.

Function CriaArquivoIniTef( VET_PARAM )
Local Tef_Handle

DEFAULT VET_PARAM   to {}

Tef_Handle := FCreate( ArquivoTef )

For I := 1 to Len(VET_PARAM)

   fWriteLine( Tef_Handle, VET_PARAM[I] )

Next

fClose(Tef_Handle)
Millisec(50)

Return .t.

Function VerificaArqStatusTef
Local Espera := 32
Local lRet := .f.

Do while Espera >= 0
   If hb_FileExists( ArqStatusTef )
      lRet := .t.
      Exit
   Endif

   Millisec(250)
   Espera--
Enddo
Return lRet


O processo é o seguinte:
1-) Cria o arquivo ('IntPos.001') de REQUISIÇÃO em 'C:\Client\Req\' (PhTEFreq)
2-) Espera o arquivo ('IntPos.001') de RESPOSTA do Sitef em 'C:\Client\Resp\' (PhTEFres)
3-) Deu algo errado? Volta pra tela pra o usuario escolher outra forma de pagamento ou outro cartao, etc...
4-) Recebeu a resposta de aprovação? Segue o processo (gravacao de dados em banco, etc) e IMPRIME a resposta do Sitef tal qual ela veio (com todos os dados da transação)
5-) No meio da impressao dos comprovantes deu problema (faltou papel, energia)? Exibe msg para o usuario CONTINUAR TENTANDO ou DESISTIR DA IMPRESSÃO
6-) Conseguiu imprimir? Manda comando de CONFIRMAÇÃO DA TRANSAÇÃO! Enquanto vc não enviar esse comando, a transação (apesar de aprovada) está PENDENTE!
7-) Não conseguiu imprimir? Manda comando de CANCELAMENTO DA TRANSAÇÃO e, se for o caso, inicia tudo de novo

Importante1: A transação TEF não está ok quando vc recebe a msg de aprovação da bandeira. A transação TEF somente de fato eh realizada quando vc consegue imprimir os comprovante e manda comando de confirmação da transação

Importante2: O que colocar nos comandos, de transação ou cancelamento, por exemplo? É so seguir o manual que la eles dizemos o que deve conter em cada

Importante3: No momento que vc envia comando de TRANSAÇÃO, o Sitef assume o barco e a interface dele é aberta. Daí o usuario vai respodendo ao Sitef aquelas costumeiras perguntas: Credito ou Debito? Quantas parcelas?, etc... Enquanto isso vc ta la parado aguardando a criaçao do arquivo de resposta. É o que nos resta fazer kkkkk. O que vc tem que fazer eh mandar o arquivo de requisição e esperar o arquivo de resposta. O restante é com o Sitef

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 13:56
por HASA
:-Y X:)
Nossa parece bastante informação para digerir, mas... vou tentar, valeu mesmo.
Sucesso.
:{
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 14:10
por HASA
:%
Jânio o que você sugere que eu grave da trasação tef, Ex: número da transação imagino e MAIS...
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 14:15
por janio
Cara, eu gravo uma lapada de coisa. So por segurança mesmo, mas nunca precisei 'conferir' ou 'auditar' pq transação foi aprovada pra mim, mas de fato naum foi... isso eh so um exemplo. Sempre tudo deu certo.
   aAdd( aCampos , { "IDENTI" , "C" , 10 , 0 } ) // NR de indentificacao. Tem q ser difenrente a cada solicitacao tef
   aAdd( aCampos , { "DATEMI" , "D" ,  8 , 0 } ) // data emissao venda (ou requisicao no caso de ADM)
   aAdd( aCampos , { "HOREMI" , "C" ,  8 , 0 } ) // hora emissao venda (ou requisicao no caso de ADM)
   aAdd( aCampos , { "TIPSOL" , "C" ,  3 , 0 } ) // tipo de solicitacao tef
   aAdd( aCampos , { "MSGOPE" , "C" , 40 , 0 } ) // Msg ao Operador (030-000 = AUTORIZADA 022167)
   aAdd( aCampos , { "NOMADM" , "C" , 12 , 0 } ) // nome da administradora do cartao (VISA) (040-000 = DEMOCARD)
   aAdd( aCampos , { "NOMRED" , "C" ,  8 , 0 } ) // nome da rede (REDECARD)
   aAdd( aCampos , { "CODPED" , "N" ,  8 , 0 } ) // numero da venda
   aAdd( aCampos , { "NUMCOO" , "N" ,  6 , 0 } ) // numero COO
   aAdd( aCampos , { "NRFECF" , "C" , 21 , 0 } ) // nr de fabricação do ecf
   aAdd( aCampos , { "TOTPED" , "N" , 15 , 2 } ) // total da venda
   aAdd( aCampos , { "TOTCRT" , "N" , 15 , 2 } ) // total do cartao
   aAdd( aCampos , { "TOTTRC" , "N" , 15 , 2 } ) // total do troco (como se fosse saque)
   aAdd( aCampos , { "TOTDES" , "N" , 15 , 2 } ) // total do desconto cielo (210-081 = 45,00)
   aAdd( aCampos , { "TXASER" , "N" , 15 , 2 } ) // taxa de servico
   aAdd( aCampos , { "TXADES" , "N" , 15 , 2 } ) // taxa de desembarque
   aAdd( aCampos , { "STSTRA" , "C" ,  3 , 0 } ) // status transacao
   aAdd( aCampos , { "STSFIN" , "C" ,  1 , 0 } ) // status FINAL da transacao (0- aprovada, 1-Pendente de confirmacao, 2-Confirmada, 3-Cancelada)
   aAdd( aCampos , { "TIPTRA" , "C" ,  2 , 0 } ) // tipo de transacao (10-cartao a vista; 22-cartao parcelado) 011-000 = 10
   aAdd( aCampos , { "NUMNSU" , "C" , 12 , 0 } ) // numero do NSU (Número Sequencial Único) (012-000)
   aAdd( aCampos , { "NSUSIT" , "C" ,  6 , 0 } ) // numero do NSU sitef (Número Sequencial Único) (043-000)
   aAdd( aCampos , { "NSUCAN" , "C" , 12 , 0 } ) // numero da nsu cancelada
   aAdd( aCampos , { "TIMSTP" , "C" , 10 , 0 } ) // timestamp transacao cancelada (026-000)
   aAdd( aCampos , { "CRTCAN" , "C" , 30 , 0 } ) // Finalizacao qndo do cancelamento (027-000 = 15042511542711542716257)
   aAdd( aCampos , { "USUCAN" , "C" , 03 , 0 } ) // Usuario q cancelou
   aAdd( aCampos , { "CPTCAN" , "C" ,  8 , 0 } ) // computador cancelamento
   aAdd( aCampos , { "HORCAN" , "C" ,  8 , 0 } ) // hora cancelamento
   aAdd( aCampos , { "DATCAN" , "C" ,  8 , 0 } ) // data cancelamento
   aAdd( aCampos , { "CODAUT" , "C" ,  6 , 0 } ) // codigo da autorizacao da transacao
   aAdd( aCampos , { "DATTRA" , "C" ,  8 , 0 } ) // data transacao
   aAdd( aCampos , { "HORTRA" , "C" ,  6 , 0 } ) // hora tranascao
   aAdd( aCampos , { "CODEST" , "C" , 10 , 0 } ) // codigo estabelecimento (150-000 = ESTAB 42)
   aAdd( aCampos , { "CODCRT" , "C" , 30 , 0 } ) // codigo controle (027-000 = 15042511542711542716257)
   aAdd( aCampos , { "USULAN" , "C" , 03 , 0 } ) // Usuario fez a transacao
   aAdd( aCampos , { "COMPUT" , "C" , 20 , 0 } ) // computador que foi feita a transacao

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 14:34
por HASA
:))
Beleza, vou na tua, vou criar um DBF só para isso.
:{ :)Pos
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 14:46
por HASA
Janio, eu acrescentaria esses 3 campos para atrelar ao cupom ( extrato ):
 aAdd( aCampos , { "CUPOM"  , "N" ,  6 , 0 } ) // Número do Cupom SAT ( Extrato )
aAdd( aCampos , { "NROCXA" , "N" ,  3 , 0 } ) // Número do Caixa ( Terminal PDV )
aAdd( aCampos , { "SERIE_SAT", "C", 15, 0 } ) // Número de série do Equipamento SAT

:)Pos

HASA

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 14:51
por janio
Sim, Hasa!

Esqueci de dizer... Eu fiz homologação APENAS para ECF. Para cupom fiscal eletronico, que imprime em impressora nao fiscal, o roteiro eh um pouco diferente.

Ceara acabou de implantar cupom eletronico (01/05/2017) e tmb preciso homolgar tef para SAT. Ja solicitei o material e estarei começando proxima semana.

Com certeza vou ter que tbm colocar esses campos na tabela.

Janio

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 15:05
por HASA
- Janio estou fazendo com a SkyTef ( SiTef da SoffExpress ) para SAT, como disse estou bem no começo e para SAT o material e raricimo por enquanto mas... aqui estamos mudando esse paradigma, valeu.
:|<
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 26 Mai 2017 16:43
por esbasso
Eu estou esperando o PIN PAD para dar sequencia com o uso da DLL.

Pin pad Gertec PPC 910

MensagemEnviado: 14 Jun 2017 09:23
por HASA
Bom dia,
:-o

- Pessoal, não estou conseguindo intender bem quando eu me oriento pelo retorno do "comando" ora "tipocomando" ora "buffer", para mim está meio confuso alguém tem um BE A BÁ do raciocínio, tipo o que tratar em que momento ?
:(

HASA

Pin pad Gertec PPC 910

MensagemEnviado: 14 Jun 2017 10:12
por janio
Nao entendi

Pin pad Gertec PPC 910

MensagemEnviado: 14 Jun 2017 10:36
por HASA
E o seguinte, no manual da SiTef ( Bibliotecas CliSiTefI e CliSiTef Versão 189 ) tem:

Tabela de códigos de retorno - pagina 10
Tabela de códigos de funções - pagina 11
Tabela de códigos de Comando - pagina 20
Tabela de valores para TipoCampo - pagina 23
Tabela de Eventos, retornados também em TipoCampo - pagina 37

Como interagir todas as tabelas.
:%
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 14 Jun 2017 14:01
por janio
Hasa

Vc manda o comando e espera o retorno. Trata este retorno conforme a tabela. Até o dia que homologuei era assim.

Como havia dito, estou às portas de fazer uma nova homologação do TEF por causa do CUPOM SAT. Proxima semana espero iniciar e aí sim vou pegar a nova documentação (ja me enviada) e ver se mudou o fluxo em relação à ultima homologação que realizei.

Se até la vc não tiver feito ainda, podemos ir fazendo junto.

Janio

Pin pad Gertec PPC 910

MensagemEnviado: 14 Jun 2017 14:08
por HASA
:D
Mais uma vez obrigado ok.
:)Pos
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 21 Jun 2017 11:20
por HASA
:(
Janio, Bom Dia,

Vê se da para clarear as ideias, o cliente vai pagar com 2 cartões de débito e 1 de crédito, cada um desses geram 2 vias do recibo da transação, primeiro como guardar esses recibos na memoria ou em DBF ou TXT?, no meio da transação um desses cartões não foram autorizados, temos que retornar e saber como o cliente vai pagar, se mudar tudo para dinheiro temos que cancelar os cartões que foram autorizados, ou o cliente quer cancelar os cartões de débito e passar para crédito, e por ai vai, estou ficando xarope só de pensar nos possibilidades, no caso do ECF é relativamente simples porque a impressão dos recibos ocorrem no final da venda concomitante correto ?
No caso do SAT temos que ter essa situação resolvida primeiro e depois enviamos o cupom, ou seja, é o inverso do ECF.

Lembrando: SiTef ok.

:'(
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 21 Jun 2017 13:34
por janio
Pois é, Hasa. O negócio é complicado...

Vc pode homologar para UM cartão ou para MULTIPLOS cartões. Foi por essa mesma complicação que vc relatou que resolvi fazer apenas para UM CARTÃO para o ECF.

Homologar apenas para um cartão é uma deficiência do sistema, eu confesso. As vezes o cliente deseja pagar COM MAIS DE UM cartão, não por falta de limite e tal... as vezes acontece de a pessoa trabalhar num empresa que fornece CARTÃO ALIMENTAÇÃO. Geralmente esses cartões tem limite bem baixo. A pessoa vai no supermercado, faz uma compra de R$ 700,00 (digamos) e quer usar o seu cartão alimentação. Como seu limite nesse cartão é apenas de R$ 300,00 (digamos), ele COMPLEMENTA o pagamento usando o seu cartão de crédito pessoal.

Realmente, esse tipo de coisa acontece no comércio e realizar homologação apenas para um cartão é uma deficiência do sistema que irei tentar sanar na homologação TEF-SAT

Aqui no Ceará, o sistema precisa ser homologado para emissao de Cupom Eletrônico. E hoje fiz a homologação e deu tudo certo.

Agora é partir para o TEF em SAT.

Pin pad Gertec PPC 910

MensagemEnviado: 21 Jun 2017 16:03
por HASA
:%
Obrigado Janio, espero que algum colega de São Paulo que tenha passado por esse sufoco de uma bela dica.
:xau
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 09 Jul 2017 10:33
por janio
Hasa, Bom dia!

Como ta o andamento do seu TEF?

Estou iniciando o desenvolvimento agora para Cupom SAT (sem impressora fiscal)

Janio

Pin pad Gertec PPC 910

MensagemEnviado: 10 Jul 2017 09:26
por HASA
:D
- Bom dia, estou parando ele essa semana porque tenho que devolver o PinPad que consegui emprestado, contudo dei alguns passos importantes, mas... o tempo com o Pindpad para eu comerçar do zero sem conhecer nada de comunicação com o GP enviar e receber tratamentos foi o que me fez perder um tempo precioso de usabilidade do pinpad. O que empaquei foi na venda com multiplos cartões, eu ainda não estou gravando nada dos retorno ( NSU´s..., etc...) estou fazendo o loop lendo e entendendo os retornos, e ainda como a impressão dos recibos TEF´s são após o retorno do SAT no primeiro momento gravei em uma variável de memoria e depois imprimo, se não cair a energia elétrica tudo bem, agora com multiplos cartões vou criar uns txt´s e imprimir depois do SAT se der tudo certo, se por uma causa o SAT der alguma rejeição ainda não sei o que fazer ( ou melhor ) como proceder para cancelar o TEF que já foi autorizado, ou seja, estou meio lá meio cá, desculpes o texto longo.
O que precisas vamos ver se posso dar uma dica.
:)Pos
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 11 Ago 2017 14:14
por HASA
:-o
Janio, você conseguiu avançar ?
:xau
HASA

Pin pad Gertec PPC 910

MensagemEnviado: 11 Ago 2017 14:42
por janio
Hasa,

Não avancei pq nao tive mais tempo! Tenho pinpad, mas não tenho impressora hehehe. Pedi a um cliente uma emprestado, passei duas semanas com ela, mas nem peguei e tive que devolver kkk.

Rapaz, a implantação do cfe aqui no Ceara ta uma confusao, sefaz dando pau toda hora e por isso comeu todo o meu tempo.

Segunda está chegando uma nova impressora pra mim e espero, enfim, fazer e ir até o final!

Te falo

Janio

Pin pad Gertec PPC 910

MensagemEnviado: 11 Ago 2017 15:16
por HASA
:{ :)Pos
Boa sorte, aguardo...
8-|

Pin pad Gertec PPC 910

MensagemEnviado: 06 Mar 2020 16:35
por rossine
Boa tarde Fernando,

Comecei a integrar meu sistema de NFC-e para usar a DLL do (Sitef) através da SkyTef.

Pelo que vi você está usando este esquema via DLL e poderia me dar umas dicas ?

Obrigado,