SAT-Fiscal a mistica está desvendada.

Fórum sobre desenvolvimento de software para atender as exigências da legislação fiscal e tributária (NFe, NFCe, NFSe, SPEED, Projeto ACBr, TEF, ECD, EFD, etc.)

Moderador: Moderadores

Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

SAT-Fiscal a mistica está desvendada.

Mensagem por alaminojunior »

Amiguinho Rochinha

Com relação ao postado pelo PauloVirt
paulovirt escreveu:Amigos, por favor uma luz. To tentando fazer o tratamento do retorno para obter o XML validado, mas ta tudo muito obscuro.
Cheguei até este ponto, mas não consigo compreender:

Código: Selecionar todos

dados := MemoRead( "c:\proemp\xml\sat\sat"+minio+".xml" )
retorno := DLLCall(h1,32,"EnviarDadosVenda",Random(), CCHAVE_SAT, dados)


xRet:= HB_Pointer2String(retorno,1000)

xTxt:= StringToArray( trim(xRet), "|" )


If xTxt[2] != '10000'
// '10000' RESPOSTA COM SUCESSO

@ 1,1 Say (xTxt[3] + ' - ' + xTxt[2])

 return .F.
 
Else

@ 1,1 Say (xTxt[3] + ' - ' + xTxt[2])

 return .F.

Endif

if !empty(xTxt[5])

@ 1,1 Say (xTxt[5] + ' - ' + xTxt[4])

Endif

// MATRIZ COM INFORMACOES PERDIDAS

@ 1,1 Say valtoprg(xTxt)


Return .T.




O parâmetro 1000 é o tamanho em bytes para receber o conteúdo no endereço de memória que foi retornado em

Código: Selecionar todos

retorno := DLLCall(h1,32,"EnviarDadosVenda",Random(), CCHAVE_SAT, dados)
Usando a DLL desta forma o retorno deste método é um ponteiro, como já respondi noutro post.

Ocorre (e já respondendo a dúvida do PauloVirt) que 1000 é muito pequeno para um arquivo XML.

Trocar o 1000 por 5000 pode não resolver, dependendo do número de itens que o cupom tenha.
Quanto mais informação no cupom, maior o xml final.

Tenho trabalhado com DLL´s da Sweda, Tanca e Bematech e os retornos tem sido iguais, ou seja, um ponteiro.

E repetindo, aí é que está o problema, pois como iremos adivinhar o tamanho que será retornado ???

Não sei se declarando os métodos da DLL como faz o Rochinha, o retorno será diferente.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SAT-Fiscal a mistica está desvendada.

Mensagem por rochinha »

Amiguinhos,
E repetindo, aí é que está o problema, pois como iremos adivinhar o tamanho que será retornado ???
Existe algum meio de apresentar este ponteiro em tela, salvar em arquivo ou coisa parecida?

A função LEN() pode ser usada para mensurar o resultado?

As funções GetProAddress(), GetProc32() e CallDLL() existem em suas versões de Harbour xHarbour?

Olhando o DLL.CH vemos que elas fazem parte da função extendida DLL32 e DLL:

Código: Selecionar todos

// Copyright FiveTech 1993-8

#ifndef _DLL_CH
#define _DLL_CH

#ifndef _C_TYPES
   #define _C_TYPES
   #define VOID     0
   #define BYTE     1
   #define CHAR     2
   #define WORD     3

#ifdef __CLIPPER__
   #define _INT     4         // conflicts with Clipper Int()
#else
   #define _INT     7
#endif

   #define BOOL     5
   #define HDC      6
   #define LONG     7
   #define STRING   8
   #define LPSTR    9
   #define PTR     10
   #define _DOUBLE 11         // conflicts with BORDER DOUBLE
   #define DWORD   12
#endif

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

#ifndef __HARBOUR__
  #ifndef __XPP__
     #ifndef __CLIPPER__
        #define __CLIPPER__
     #endif
  #endif
#endif

#ifndef __CLIPPER__
   #translate DLL32 => DLL
#endif

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

#xcommand DLL [<static:STATIC>] FUNCTION <FuncName>( [ <uParam1> AS <type1> ] ;
                                                     [, <uParamN> AS <typeN> ] ) ;
             AS <return> [<pascal:PASCAL>] [ FROM <SymName> ] LIB <*DllName*> ;
       => ;
          [<static>] function <FuncName>( [NOREF(<uParam1>)] [,NOREF(<uParamN>)] ) ;;
             local hDLL := If( ValType( <DllName> ) == "N", <DllName>, LoadLibrary( <(DllName)> ) ) ;;
             local uResult ;;
             local cFarProc ;;
             if Abs( hDLL ) > 32 ;;
                cFarProc = GetProcAddress( hDLL,;
                If( [ Empty( <SymName> ) == ] .t., <(FuncName)>, <SymName> ),;
                [<.pascal.>], <return> [,<type1>] [,<typeN>] ) ;;
                uResult = CallDLL( cFarProc [,<uParam1>] [,<uParamN>] ) ;;
                If( ValType( <DllName> ) == "N",, FreeLibrary( hDLL ) ) ;;
             else ;;
                MsgAlert( "Error code: " + LTrim( Str( hDLL ) ) + " loading " + <DllName> ) ;;
             end ;;
          return uResult

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

#xcommand DLL32 [<static:STATIC>] FUNCTION <FuncName>( [ <uParam1> AS <type1> ] ;
                                                      [, <uParamN> AS <typeN> ] ) ;
             AS <return> [<pascal:PASCAL>] [ FROM <SymName> ] LIB <*DllName*> ;
       => ;
          [<static>] function <FuncName>( [NOREF(<uParam1>)] [,NOREF(<uParamN>)] ) ;;
             local hDLL := If( ValType( <DllName> ) == "N", <DllName>, LoadLib32( <(DllName)> ) ) ;;
             local uResult ;;
             local cFarProc ;;
             if Abs( hDLL ) <= 32 ;;
                MsgAlert( "Error code: " + LTrim( Str( hDLL ) ) + " loading " + <DllName> ) ;;
             else ;;
                cFarProc = GetProc32( hDLL,;
                If( [ Empty( <SymName> ) == ] .t., <(FuncName)>, <SymName> ),;
                [<.pascal.>], <return> [,<type1>] [,<typeN>] ) ;;
                uResult = CallDLL32( cFarProc [,<uParam1>] [,<uParamN>] ) ;;
                If( ValType( <DllName> ) == "N",, FreeLib32( hDLL ) ) ;;
             end ;;
          return uResult

#endif

//----------------------------------------------------------------------------//
Se estas funções existirem em seus Harbours e xHarbours podem tentar usar o que postei, caso não podem trocar CallDLL() por DllCall().

É preciso obter um resultado com a sua versão.
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.
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

SAT-Fiscal a mistica está desvendada.

Mensagem por alaminojunior »

Rochinha
Existe algum meio de apresentar este ponteiro em tela, salvar em arquivo ou coisa parecida?
A função LEN() pode ser usada para mensurar o resultado?
O retorno da dllcall(h1,32,"enviardadosvenda .... " é um ponteiro, pelo menos na minha versão de xHarbour.
A única maneira de trazer o conteúdo do trecho de memória referente a este ponteiro, é usando a HB_Pointer2String.
Primeiro parâmetro sendo o ponteiro (endereço) e segundo parâmetro sendo o tamanho (bytes) deste conteúdo. Mas o próprio help do xHarbour atenta para o problema de não se enviar um valor muito alto, pois coisas 'estranhas podem acontecer'
Eu creio que não existe um meio de saber o tamanho da string retornada.
Pessoalmente, fiz uma rotina que 'tenta aproximar' o tamanho da string retornada, tomando como base o tamanho do XML enviado para o SAT.
As funções GetProAddress(), GetProc32() e CallDLL() existem em suas versões de Harbour xHarbour?

Olhando o DLL.CH vemos que elas fazem parte da função extendida DLL32 e DLL:
Com exceção da GetProc32, tenho as demais funções em minha versão.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

SAT-Fiscal a mistica está desvendada.

Mensagem por Jairo Maia »

Olá Pessoal,

Esse ponteiro é o endereço do segmento de memória onde foi colocado o conteúdo de retorno. Se o segundo parâmetro é maior que a variável, os bytes excedentes são caracteres não imprimíveis. Para saber o tamanho da string retornada pode fazer:

Código: Selecionar todos

cString := Left( cString, Hb_At( Chr( 0 ), cString ) - 1 )
O grande problema dessa função é que com frequência ocorre o erro: Unrecoverable error 6005: Exception Error. Porisso ocorre o que o alaminojunior já citou anteriormente, que é uma tela esbranquiçada e o programa trava.

Na verdade o programa para de responder e o Windows fica tentando dar o aviso, mas nem sempre consegue.

Editado às 10:26 para corrigir o código que estava incompleto.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SAT-Fiscal a mistica está desvendada.

Mensagem por rochinha »

Amiguinhos,

Isto é desconfortável. Pois quase implica em se usar outra ferramenta diferente daquela a que estamos acostumados.

Uma coisa que reparei, em um post que o asimoes postou, o Harbour tem uma função chamada hb_DynCall():

Código: Selecionar todos

hb_DynCall( { "FullQRCode", hLib, HB_DYN_CALLCONV_STDCALL  }, .T., .F., RGBCor(255,255,255), RGBCor(0,0,0),  cStr, ;
               3,;
               1,;
               5, 5, 200, 200, cFile )
Reparei que nas chamadas CallDLL() o segundo parametro é 32, sempre usamos ele, porque?

32 é o valor de DC_CALL_STD, creio eu, pois não entendi se ele define como sendo standard a entrada de dados ou se a saida será neste formato. Portanto é verificar as outras opçoes para formatar a saida.

A hb_DynCall() também pode usar HB_DYN_CTYPE_DEFAULT, HB_DYN_CTYPE_CHAR_UNSIGNED, HB_DYN_CTYPE_CHAR_PTR, HB_DYN_CTYPE_CHAR_UNSIGNED_PTR, HB_DYN_CALLCONV_CDECL os quais não sei os valores.

O terceiro parametro do vetor passado para hb_DynCall() pode ser algo também como hb_bitOr( HB_DYN_CTYPE_CHAR_PTR , HB_DYN_CALLCONV_STDCALL ), resta entender melhor o seu funcionamento e se ela é compatível com vossas versões de Harbour.

Vamos usá-la.

Segundo Help Vouch.info-HBW32 existem as diversas funções CallDLL(), DLLCall().

Exemplos podem existir nas pastas do Harbour em tests/testdyn.prg e tests/testdyn1.prg

Recentemente me deparei com FWCallDll() que deve compor a biblioteca Fivewin.
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.
Edvaldo
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 17 Fev 2016 12:09
Localização: ubatuba

SAT-Fiscal a mistica está desvendada.

Mensagem por Edvaldo »

Ok, voltei, estava fora.
Pessoal, eu acho que o problema é descobrir o por que todas as dlls usadas com as ECFs, como daruma, bematech, sweda, Elgin. dataregis, Epson e outras funcionam perfeitamente assim, por exemplo:
DLL32 FUNCTION rCFVerificarStatus_ECF_Daruma( cStatusCF AS STRING, piStatusCF AS _INT ) AS LONG PASCAL
FROM "rCFVerificarStatus_ECF_Daruma" LIB xDll
xRetorno:=rCFVerificarStatus_ECF_Daruma(xPar1, xPar2)
A varável xRetorno sempre conterá realmente o resultado do retorno ou um código de erro; Agora a Dll do sat não funciona assim, o retorno é uma cadeia de números, como já foi dito aqui que é endereço de memória muito complicado por que ninguém sabe o seu tamanho e simplesmente o programa não funciona e o Windows para o programa.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SAT-Fiscal a mistica está desvendada.

Mensagem por rochinha »

Amiguinhos,

edvaldo
anexa sua 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.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SAT-Fiscal a mistica está desvendada.

Mensagem por rochinha »

Amiguinhos,

Espero que tenham obtido algum resultado bom com as dicas anteriores.

Olhando no seguinte tópico encontrei um set de funções que faz acesso diretamente com Harbour.

Usem as funções deste set conforme a sua necessidade e deixem de fazer as chamadas via DllCall():

Código: Selecionar todos

***********************************************************************************
* Chamadas para DLL Funções de manipulação do cupom fiscal eletrônico Sweda
***********************************************************************************

Function EnviarDadosVenda(nNumeroSessao, cCodigoAtivacao, cDados)
   Local cString:= SATENVIARDADOSVENDA(nNumeroSessao, cCodigoAtivacao, cDados), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ConsultarSAT()
   Local cString:= SATCONSULTAR(Random(999999)), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ConsultarStatusOperacionalSAT(nNumeroSessao, cCodigoAtivacao)
   Local cString:= SATCONSULTARSTATUSOPERACIONAL(nNumeroSessao, cCodigoAtivacao), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function AtivarSAT(nNumeroSessao, subComando, cCodigoAtivacao, CNPJ, cUF)
   Local cString:= SATATIVAR(nNumeroSessao, subComando, cCodigoAtivacao, CNPJ, cUF), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function AssociarAssinaturaSAT(nNumeroSessao, cCodigoAtivacao, CNPJ, CNPJSH )
   Local cString:= SATASSOCIARASSINATURA(nNumeroSessao, cCodigoAtivacao, CNPJ, CNPJSH), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ConsultarNumeroSessao(nNumeroSessao, cCodigoAtivacao, nNumeroSessao2)
   Local cString:= SATCONSULTARNUMEROSESSAO(nNumeroSessao, cCodigoAtivacao,nNumeroSessao2), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function TesteFimAFim(nNumeroSessao, cCodigoAtivacao, cDados)
   Local cString := SATTESTEFIMAFIM(nNumeroSessao, cCodigoAtivacao, cDados), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function CancelarUltimaVenda(nNumeroSessao, cCodigoAtivacao, chaveAcesso, cDados)
   Local cString:= SATCANCELARULTIMAVENDA(nNumeroSessao, cCodigoAtivacao, chaveAcesso, cDados), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ExtrairLogsSAT(nNumeroSessao, cCodigoAtivacao)
   Local cString:= SATEXTRAIRLOGS(nNumeroSessao, cCodigoAtivacao), aString:= HB_ATOKENS(cString, [|])
   Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

#pragma BEGINDUMP

   #include "hbapi.h"
   #include "windows.h"

   typedef LPSTR (WINAPI *_CONSULTARSAT)          ( INT nRandom );
   typedef LPSTR (WINAPI *_ATIVARSAT)             ( INT nRandom, INT   nSubComando , LPSTR cCodAtivacao, LPSTR cCNPJ, INT nUF );
   typedef LPSTR (WINAPI *_ASSOCIARASSINATURASAT) ( INT nRandom, LPSTR cCodAtivacao, LPSTR cCNPJ, LPSTR cAssCNPJ );
   typedef LPSTR (WINAPI *_CONSULTARSECAOSAT)     ( INT nRandom, LPSTR cCodAtivacao, LPSTR cNumSecao );
   typedef LPSTR (WINAPI *_TESTEFIMAFIMSAT)       ( INT nRandom, LPSTR cCodAtivacao, LPSTR cDadosVenda);
   typedef LPSTR (WINAPI *_ENVIARVENDASAT)        ( INT nRandom, LPSTR cCodAtivacao, LPSTR cDadosVenda);
   typedef LPSTR (WINAPI *_CANULTIMAVENDASAT)     ( INT nRandom, LPSTR cCodAtivacao, LPSTR cChave, LPSTR cDadosVenda);
   typedef LPSTR (WINAPI *_CONSULTARSTATUSSAT)    ( INT nRandom, LPSTR cCodAtivacao);
   typedef LPSTR (WINAPI *_ATUALIZARSOFTWARE)     ( INT nRandom, LPSTR cCodAtivacao);
   typedef LPSTR (WINAPI *_EXTRAIRLOGS)           ( INT nRandom, LPSTR cCodAtivacao);

    HB_FUNC( SATCONSULTAR )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
        _CONSULTARSAT pFunc;
           pFunc = (_CONSULTARSAT) GetProcAddress(handle, "ConsultarSAT");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1)) );
           FreeLibrary( handle );
       }
   }

   HB_FUNC( SATATIVAR )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _ATIVARSAT pFunc;
           pFunc = (_ATIVARSAT) GetProcAddress(handle, "AtivarSAT");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parni(2), hb_parc(3), hb_parc(4), hb_parni(5)) );
           FreeLibrary( handle );
       }
   }

   HB_FUNC( SATASSOCIARASSINATURA )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _ASSOCIARASSINATURASAT pFunc;
           pFunc = (_ASSOCIARASSINATURASAT) GetProcAddress(handle, "AssociarAssinatura");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3), hb_parc(4)) );
           FreeLibrary( handle );
       }
      }

   HB_FUNC( SATCONSULTARNUMEROSESSAO )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _CONSULTARSECAOSAT pFunc;
           pFunc = (_CONSULTARSECAOSAT) GetProcAddress(handle, "ConsultarNumeroSessao");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3)) );
           FreeLibrary( handle );
       }
   }

   HB_FUNC( SATTESTEFIMAFIM )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _TESTEFIMAFIMSAT pFunc;
           pFunc = (_TESTEFIMAFIMSAT) GetProcAddress(handle, "TesteFimAFim");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3)) );
           FreeLibrary( handle );
       }
   }

   HB_FUNC( SATENVIARDADOSVENDA )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _ENVIARVENDASAT pFunc;
           pFunc = (_ENVIARVENDASAT) GetProcAddress(handle, "EnviarDadosVenda");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3)) );
           FreeLibrary( handle );
       }
   }
   HB_FUNC( SATCANCELARULTIMAVENDA )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _CANULTIMAVENDASAT pFunc;
           pFunc = (_CANULTIMAVENDASAT) GetProcAddress(handle, "CancelarUltimaVenda");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3), hb_parc(4)) );
           FreeLibrary( handle );
       }
   }

   HB_FUNC( SATCONSULTARSTATUSOPERACIONAL )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _CONSULTARSTATUSSAT pFunc;
           pFunc = (_CONSULTARSTATUSSAT) GetProcAddress(handle, "ConsultarStatusOperacional");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2)) );
           FreeLibrary( handle );
       }
      }

   HB_FUNC( SATATUALIZARSOFTWARE )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _ATUALIZARSOFTWARE pFunc;
           pFunc = (_ATUALIZARSOFTWARE) GetProcAddress(handle, "AtualizarSoftwareSAT");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2)) );
           FreeLibrary( handle );
       }
   }

   HB_FUNC( SATEXTRAIRLOGS )
   {
       HINSTANCE handle = LoadLibrary("sat.dll");

       if (handle)
       {
           _EXTRAIRLOGS pFunc;
           pFunc = (_EXTRAIRLOGS) GetProcAddress(handle, "ExtrairLogs");
           hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2)) );
           FreeLibrary( handle );
       }
   }

 #pragma ENDDUMP
Pelo que pude perceber nos trechos:

Código: Selecionar todos

   typedef LPSTR (WINAPI *_CONSULTARSAT)          ( INT nRandom );
   typedef LPSTR (WINAPI *_ATIVARSAT)             ( INT nRandom, INT   nSubComando , LPSTR cCodAtivacao, LPSTR cCNPJ, INT nUF );
   typedef LPSTR (WINAPI *_ASSOCIARASSINATURASAT) ( INT nRandom, LPSTR cCodAtivacao, LPSTR cCNPJ, LPSTR cAssCNPJ );
   typedef LPSTR (WINAPI *_CONSULTARSECAOSAT)     ( INT nRandom, LPSTR cCodAtivacao, LPSTR cNumSecao );
Estamos definindo que os retornos venham como LPSTR que significa, acho eu, Long Pointer STRing. Que tal trocá-las por STRING somente.

Vejamos:

Código: Selecionar todos

#ifndef _C_TYPES
   #define _C_TYPES
   #define VOID     0
   #define BYTE     1
   #define CHAR     2
   #define WORD     3
   #define _INT     7
   #define BOOL     5
   #define HDC      6
   #define LONG     7
   #define STRING   8
   #define LPSTR    9
   #define PTR     10
   #define _DOUBLE 11 // conflicts with BORDER DOUBLE
   #define DWORD   12
#endif
Talvez seja um túnel no fim da luz, ou não.
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.
Edvaldo
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 17 Fev 2016 12:09
Localização: ubatuba

SAT-Fiscal a mistica está desvendada.

Mensagem por Edvaldo »

Ok, testei a função ConsultarSAT mas dá erro logo em cString:= SATCONSULTAR(Random()), não retorna e o Windows fica tentando achar uma solução pro erro. Borland Windows Custom Control Library parou de funcionar. Um problema fez com que o programa parasse de funcionar corretamente.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SAT-Fiscal a mistica está desvendada.

Mensagem por rochinha »

Amiguinhos,

edvaldo
Apresente-nos seu código e se possível anexe este executável teste.
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.
Edvaldo
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 17 Fev 2016 12:09
Localização: ubatuba

SAT-Fiscal a mistica está desvendada.

Mensagem por Edvaldo »

Opa, o simulador registrou que foi feito uma consulta. vou continuar fussando mais.
Edvaldo
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 17 Fev 2016 12:09
Localização: ubatuba

SAT-Fiscal a mistica está desvendada.

Mensagem por Edvaldo »

Ok, fiz alguns testes e acho que o caminho para a soluçãoo do problema é esta forma de trabalho heim. Nos testes que fiz o simulador reconheceu as chamadas porém o programa fica sem controlenão retornando a linha logo abaixo da execução. segue o exemplo que é uma copia do original

Código: Selecionar todos

***********************************************************************************
* Chamadas para DLL Funções de manipulação do cupom fiscal eletrônico Sweda
***********************************************************************************

#include "fivewin.ch"


Function Main()
   local xRet:=Consultarsat()
   ?"Resposta",xRet
Return Nil

Function EnviarDadosVenda(nNumeroSessao, cCodigoAtivacao, cDados)
 Local cString:= SATENVIARDADOSVENDA(nNumeroSessao, cCodigoAtivacao, cDados), aString:= HB_ATOKENS(cString, [|])
Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ConsultarSAT()
 Local cString:= SATCONSULTAR(Random()), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ConsultarStatusOperacionalSAT(nNumeroSessao, cCodigoAtivacao)
 Local cString:= SATCONSULTARSTATUSOPERACIONAL(nNumeroSessao, cCodigoAtivacao), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function AtivarSAT(nNumeroSessao, subComando, cCodigoAtivacao, CNPJ, cUF)
 Local cString:= SATATIVAR(nNumeroSessao, subComando, cCodigoAtivacao, CNPJ, cUF), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function AssociarAssinaturaSAT(nNumeroSessao, cCodigoAtivacao, CNPJ, CNPJSH )
 Local cString:= SATASSOCIARASSINATURA(nNumeroSessao, cCodigoAtivacao, CNPJ, CNPJSH), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ConsultarNumeroSessao(nNumeroSessao, cCodigoAtivacao, nNumeroSessao2)
 Local cString:= SATCONSULTARNUMEROSESSAO(nNumeroSessao, cCodigoAtivacao,nNumeroSessao2), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function TesteFimAFim(nNumeroSessao, cCodigoAtivacao, cDados)
 Local cString := SATTESTEFIMAFIM(nNumeroSessao, cCodigoAtivacao, cDados), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function CancelarUltimaVenda(nNumeroSessao, cCodigoAtivacao, chaveAcesso, cDados)
 Local cString:= SATCANCELARULTIMAVENDA(nNumeroSessao, cCodigoAtivacao, chaveAcesso, cDados), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

Function ExtrairLogsSAT(nNumeroSessao, cCodigoAtivacao)
 Local cString:= SATEXTRAIRLOGS(nNumeroSessao, cCodigoAtivacao), aString:= HB_ATOKENS(cString, [|])
 Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))

#pragma BEGINDUMP

 #include "hbapi.h"
 #include "windows.h"

 typedef LPSTR (WINAPI *_CONSULTARSAT)     ( INT nRandom );
 typedef LPSTR (WINAPI *_ATIVARSAT)      ( INT nRandom, INT nSubComando , LPSTR cCodAtivacao, LPSTR cCNPJ, INT nUF );
 typedef LPSTR (WINAPI *_ASSOCIARASSINATURASAT) ( INT nRandom, LPSTR cCodAtivacao, LPSTR cCNPJ, LPSTR cAssCNPJ );
 typedef LPSTR (WINAPI *_CONSULTARSECAOSAT)  ( INT nRandom, LPSTR cCodAtivacao, LPSTR cNumSecao );
 typedef LPSTR (WINAPI *_TESTEFIMAFIMSAT)   ( INT nRandom, LPSTR cCodAtivacao, LPSTR cDadosVenda);
 typedef LPSTR (WINAPI *_ENVIARVENDASAT)    ( INT nRandom, LPSTR cCodAtivacao, LPSTR cDadosVenda);
 typedef LPSTR (WINAPI *_CANULTIMAVENDASAT)  ( INT nRandom, LPSTR cCodAtivacao, LPSTR cChave, LPSTR cDadosVenda);
 typedef LPSTR (WINAPI *_CONSULTARSTATUSSAT)  ( INT nRandom, LPSTR cCodAtivacao);
 typedef LPSTR (WINAPI *_ATUALIZARSOFTWARE)  ( INT nRandom, LPSTR cCodAtivacao);
 typedef LPSTR (WINAPI *_EXTRAIRLOGS)     ( INT nRandom, LPSTR cCodAtivacao);

  HB_FUNC( SATCONSULTAR )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
    _CONSULTARSAT pFunc;
     pFunc = (_CONSULTARSAT) GetProcAddress(handle, "ConsultarSAT");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1)) );
     FreeLibrary( handle );
   }
 }

 HB_FUNC( SATATIVAR )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _ATIVARSAT pFunc;
     pFunc = (_ATIVARSAT) GetProcAddress(handle, "AtivarSAT");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parni(2), hb_parc(3), hb_parc(4), hb_parni(5)) );
     FreeLibrary( handle );
   }
 }

 HB_FUNC( SATASSOCIARASSINATURA )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _ASSOCIARASSINATURASAT pFunc;
     pFunc = (_ASSOCIARASSINATURASAT) GetProcAddress(handle, "AssociarAssinatura");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3), hb_parc(4)) );
     FreeLibrary( handle );
   }
   }

 HB_FUNC( SATCONSULTARNUMEROSESSAO )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _CONSULTARSECAOSAT pFunc;
     pFunc = (_CONSULTARSECAOSAT) GetProcAddress(handle, "ConsultarNumeroSessao");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3)) );
     FreeLibrary( handle );
   }
 }

 HB_FUNC( SATTESTEFIMAFIM )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _TESTEFIMAFIMSAT pFunc;
     pFunc = (_TESTEFIMAFIMSAT) GetProcAddress(handle, "TesteFimAFim");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3)) );
     FreeLibrary( handle );
   }
 }

 HB_FUNC( SATENVIARDADOSVENDA )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _ENVIARVENDASAT pFunc;
     pFunc = (_ENVIARVENDASAT) GetProcAddress(handle, "EnviarDadosVenda");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3)) );
     FreeLibrary( handle );
   }
 }
 HB_FUNC( SATCANCELARULTIMAVENDA )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _CANULTIMAVENDASAT pFunc;
     pFunc = (_CANULTIMAVENDASAT) GetProcAddress(handle, "CancelarUltimaVenda");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2), hb_parc(3), hb_parc(4)) );
     FreeLibrary( handle );
   }
 }

 HB_FUNC( SATCONSULTARSTATUSOPERACIONAL )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _CONSULTARSTATUSSAT pFunc;
     pFunc = (_CONSULTARSTATUSSAT) GetProcAddress(handle, "ConsultarStatusOperacional");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2)) );
     FreeLibrary( handle );
   }
   }

 HB_FUNC( SATATUALIZARSOFTWARE )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _ATUALIZARSOFTWARE pFunc;
     pFunc = (_ATUALIZARSOFTWARE) GetProcAddress(handle, "AtualizarSoftwareSAT");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2)) );
     FreeLibrary( handle );
   }
 }

 HB_FUNC( SATEXTRAIRLOGS )
 {
   HINSTANCE handle = LoadLibrary("sat.dll");

   if (handle)
   {
     _EXTRAIRLOGS pFunc;
     pFunc = (_EXTRAIRLOGS) GetProcAddress(handle, "ExtrairLogs");
     hb_retc( ( LPSTR ) pFunc(hb_parni(1), hb_parc(2)) );
     FreeLibrary( handle );
   }
 }

 #pragma ENDDUMP
Editado pela última vez por Toledo em 22 Mar 2016 08:19, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

SAT-Fiscal a mistica está desvendada.

Mensagem por rochinha »

Amiguinhos,

edvaldo
Faça esta modificação:

Código: Selecionar todos

Function ConsultarSAT()
Local cString:= SATCONSULTAR(Random()), aString:= HB_ATOKENS(cString, [|])

? cString

Return (Iif(Valtype(aString) # [A] .or. len(aString) < 1, {[0], [], [SAT-CFe: Sem Retorno], [], []}, aString))
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.
Edvaldo
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 17 Fev 2016 12:09
Localização: ubatuba

SAT-Fiscal a mistica está desvendada.

Mensagem por Edvaldo »

Ok, fiz a alteração e continua comunicando com o SAT porém após executar o comando: local cString:= SATCONSULTAR(Random()) o programa retorna ao prompt de comandos sem dar erros. Não chega a executar o segundo comando: aString:= HB_ATOKENS(cString, [|]), por tanto não mostra o resultado: ? cString
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

SAT-Fiscal a mistica está desvendada.

Mensagem por alaminojunior »

Amiguinhos, desculpem não poder contribuir testando o código.
Estou fora do escritório por uns dias e não consigo nem instalar o simulador do SAT aqui neste PC.

Mas no caso:

Código: Selecionar todos

aString:= HB_ATOKENS(cString, [|])
Não sei se daria na mesma, mas o correto não seria:

Código: Selecionar todos

aString:= HB_ATOKENS(cString, '|')
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Responder