Página 10 de 21

SAT-Fiscal a mistica está desvendada.

Enviado: 27 Jun 2015 19:27
por Itamar M. Lins Jr.
Essa associação será efetuado apenas uma vez.
E se a empresa trocar de programa ?
O aparelho SAT fica travado na primeira empresa ? como é isso ?

Saudações,
Itamar M. Lins Jr.

SAT-Fiscal a mistica está desvendada.

Enviado: 29 Jun 2015 10:03
por HASA
:-O
Itamar boa pergunta, nesse caso o manual não é BEM claro mas... entende-se pelas rejeições que trocaria o vinculo de um para outro sem problemas ou quase isso.
:)Pos
HASA

SAT-Fiscal a mistica está desvendada.

Enviado: 25 Jul 2015 09:43
por ocrestani
Bom dia.
Alguém teria um exemplo completo para SAT Elgin? Tentei recompilar os exemplos do Rochinha(satteste) mas está dando erro na DLL.CH. Uso xHarbour com Minigui.
Abraços.

SAT-Fiscal a mistica está desvendada.

Enviado: 11 Ago 2015 10:39
por rochinha
Amiguinhos,

A DLL.CH server apenas de perfumaria para comandar o tratamento de chamadas as funções de uma .DLL.

Voce pode usar chamadas via CallDLL() do xHarbour tendo em vista que o Harbour(o qual eu uso) faz chamadas através de DllCall(). Funções com nomes diferentes mas propósitos idênticos.

SAT-Fiscal a mistica está desvendada.

Enviado: 16 Set 2015 10:41
por Marcelo.1505
Bom Dia a todos!

Sou novo aqui no Fórum, e desenvolvedor em Clipper, e acompanho as postagens aqui sempre. A algum tempo migrei para harbour (Usando a ide HMG com a dica do post Pablo César). Utilizo em MODO CONSOLE.
Estou trabalhando no SAT através das dicas do rochinha, para compilar meus testes. Mas ainda não obtive exito.
Utilizando os fontes que ele postou mais a DLL.CH da o seguinte erro: Error E0030 Syntax error "syntax error at '('"
Como não consegui a solução, estou tentando fazer as chamadas direto pela DLL,(mas nunca trabalhei com DLLs) da seguinte forma:

function Main()
PUBLIC WDLLSAT
WDLLSAT := LoadLibrary( "SAT.dll" )
@ 01,30 SAY WDLLSAT //aqui carregou e retorna o Num 1888485376 mesmo numero retornado no exemplo do Rochinha
RetDLL = CallDll(GeraRandom( 999999 ),32,"SATConsultar") //// dessa forma o retorno é sempre NIL
// RetDLL = CallDLL32("SATConsultar",WDLLSAT, nSessionRandom) //// dessa forma o retorno é sempre -2000

@ 02,35 SAY RetDLL


Por favor, se puderem me ajudar, fico grato!
Os prazos estão estourando, e cliente pressionando.

Obrigado!

SAT-Fiscal a mistica está desvendada.

Enviado: 16 Set 2015 10:55
por alaminojunior
Marcelo.1505 escreveu:RetDLL = CallDll(GeraRandom( 999999 ),32,"SATConsultar") //// dessa forma o retorno é sempre NIL
Posso estar enganado, pois trabalho com xHarbour, mas não estaria faltando o handle da DLL carregada ?

Código: Selecionar todos

h1:= LoadLibrary("SAT.DLL")

ret:= dllcall(h1,32,"EnviarDadosVenda",cSessao,sat_cod_atv,xXml)

SAT-Fiscal a mistica está desvendada.

Enviado: 16 Set 2015 13:10
por Marcelo.1505
Legal!
Segui a idéia do amigo alaminojunior e através do uso da DllCall() ja mudou o erro...

O código ficou assim:
function Main()
PUBLIC h1
h1 := LoadLibrary("SAT.dll")
RetDLL := DllCall(h1,32,"ConsultarSAT",GeraRandom(999999))


E este foi o erro, que SAT.EXE parou de funcionar, e da esses erros:
Unrecoverable error 6005: Exception error:

Exception Code:C00000FD
Exception Address:00419203
EAX:FFE03530 EBX:0022FAD0 ECX:2FC6E8C8 EDX:2FA71DF8
ESI:D039173C EDI:0BF1BA30 EBP:004B68E4
CS:EIP:001B:00419203 SS:ESP:0023:0022F9D0
DS:0023 ES:0023 FS:003B GS:0000
Flags:00010212
CS:EIP: 89 54 03 FC 83 E8 04 39 F0 75 F2 E9 AB FE FF FF
SS:ESP: 2FC6E7CC 2FC6E7D0 2FC6E7D4 2FC6E7D8 2FC6E7DC 2FC6E7E0 2FC6E7E4 2FC6E
7E8 2FC6E7EC 2FC6E7F0 2FC6E7F4 2FC6E7F8 2FC6E7FC 2FC6E800 2FC6E804 2FC6E808

C stack:
EIP: EBP: Frame: OldEBP, RetAddr, Params...

Modules:
0x00400000 0x001BC000 J:\HMG\SAT\SAT.EXE
0x77430000 0x0013C000 C:\Windows\SYSTEM32\ntdll.dll
0x76B20000 0x000D4000 C:\Windows\system32\kernel32.dll
0x75520000 0x0004B000 C:\Windows\system32\KERNELBASE.dll
0x75760000 0x000A0000 C:\Windows\system32\ADVAPI32.DLL
0x769C0000 0x000AC000 C:\Windows\system32\msvcrt.dll
0x76780000 0x00019000 C:\Windows\SYSTEM32\sechost.dll
0x76A70000 0x000A1000 C:\Windows\system32\RPCRT4.dll
0x73660000 0x0019E000 C:\Windows\WinSxS\x86_microsoft.windows.common-controls_65
95b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2\COMCTL32.DLL
0x77610000 0x0004E000 C:\Windows\system32\GDI32.dll
0x76500000 0x000C9000 C:\Windows\system32\USER32.dll
0x75890000 0x0000A000 C:\Windows\system32\LPK.dll
0x770A0000 0x0009D000 C:\Windows\system32\USP10.dll
0x775B0000 0x00057000 C:\Windows\system32\SHLWAPI.dll
0x75800000 0x0007B000 C:\Windows\system32\COMDLG32.DLL
0x758A0000 0x00C4A000 C:\Windows\system32\SHELL32.dll
0x70D50000 0x00021000 C:\Windows\system32\MSVFW32.DLL
0x711B0000 0x00032000 C:\Windows\system32\WINMM.dll
0x76860000 0x0015C000 C:\Windows\system32\OLE32.dll
0x765D0000 0x0008F000 C:\Windows\system32\OLEAUT32.DLL
0x676D0000 0x00051000 C:\Windows\system32\WINSPOOL.DRV
0x75740000 0x0001F000 C:\Windows\system32\IMM32.DLL
0x766B0000 0x000CC000 C:\Windows\system32\MSCTF.dll
0x6C520000 0x00115000 C:\Program Files\GbPlugin\gbpinj.dll
0x74970000 0x00021000 C:\Windows\system32\ntmarta.dll
0x76660000 0x00045000 C:\Windows\system32\WLDAP32.dll
0x75340000 0x0000C000 C:\Windows\system32\CRYPTBASE.dll
0x71BD0000 0x00040000 C:\Windows\system32\uxtheme.dll
0x70900000 0x00013000 J:\HMG\SAT\SAT.dll

Called from DLLCALL(0)
Called from MAIN(21) in J:/HMG/SAT/sat.prg


Mais uma vez, agradecido!!!

SAT-Fiscal a mistica está desvendada.

Enviado: 16 Set 2015 13:58
por alaminojunior
Normalmente estes erros são por conta do tipo do parâmetro.
O número de sessão, experimente enviar string ao invés de numérico, ou o contrário.

SAT-Fiscal a mistica está desvendada.

Enviado: 17 Set 2015 16:16
por Marcelo.1505
É, infelizmente não vai.
Mesmo trocando o formato do parâmetro.
Tentei usar DllCall, CallDll, CallDll32,
Mas tudo sem sucesso!! :(

SAT-Fiscal a mistica está desvendada.

Enviado: 17 Set 2015 16:30
por alaminojunior

Código: Selecionar todos

h1 := LoadLibrary("SAT.dll")
Conferiu para ver se foi carregada a DLL ?
A função LoadLibrary() deve retornar um handle ! Se retornar 0, é porque não carregou. Pode não ter encontrado a DLL.

Código: Selecionar todos

RetDLL := DllCall(h1,32,"ConsultarSAT",GeraRandom(999999))
Essa função GeraRandom() retorna o quê ?

SAT-Fiscal a mistica está desvendada.

Enviado: 17 Set 2015 17:16
por Marcelo.1505
A Função LoadLibrary retorna um numero válido: 1888485376, que é o mesmo numero exibido em um Exemplo disponibilizado aqui no fórum, pelo Rochinha.

Já a função GeraRandom() retorna um valor numérico.
Porém, ja até tentei eliminar o uso dessa função e carreguei diretamente o Numero da Sessão, mas nada... coloquei o numero da sessão como Caracter (entre aspas) e nada.

SAT-Fiscal a mistica está desvendada.

Enviado: 17 Set 2015 18:45
por malcarli
Boa noite em harbour existe a função Random(), que no caso do sat poder substituir a função GeraRandom(999999) por Random(999999).

SAT-Fiscal a mistica está desvendada.

Enviado: 17 Set 2015 19:03
por malcarli
Caro Marcelo, usando as rotinas do Rochinha, consegui fazer funcionar perfeitamente em harbour com Minigui Extended e o sat da sweda. Só não consegui fazer o cancelamento, não por problema no comando, mas por erro na montagem do xml de cancelamento que ainda não descobri o porque e como sempre estamos sem tempo para voltar e retomar. Segue abaixo trecho do que fiz e está funcionando, utilizando algumas rotinas em c.

Código: Selecionar todos

/*****************************************************************************
 * SISTEMA  : ROTINA EVENTUAL                                                *
 * PROGRAMA : SAT-SWEDA.PRG   		                                     *
 * OBJETIVO : Cupom Fiscal Eletrônico - SWEDA                                *
 * AUTOR    : Marcelo Antonio Lázzaro Carli                                  *
 * DATA     : 29.05.2015                                                     *
 * ULT. ALT.: 18.08.2015                                                     *
 *****************************************************************************/
#include <minigui.ch>
#include <miniprint.ch>

Procedure Main()
   Private nCfe:= Random(999999), cXml:= [teste]
  
   REQUEST HB_LANG_PT
   HB_LangSelect([PT])
   REQUEST HB_CODEPAGE_PT850 &&& PARA INDEXAR CAMPOS ACENTUADOS
   HB_SETCODEPAGE([PT850])   &&& PARA INDEXAR CAMPOS ACENTUADOS

   Set wrap on
   Set talk off
   Set date briti             &&& data no formato dd/mm/aaaa
   Set dele on                &&& ignora registros marcados por deleção
   Set score off
   Set exact on
   Set ToolTip on
   Setcancel(.F.)             &&& evitar cancelar sistema c/ ALT + C
   Set cent on                &&& ano com 4 dígitos
   Set epoch to 2000          &&& ano a partir de 2000
   Set excl off               &&& abre arquivos em modo compartilhado
   Set navigation extended    &&& enter no lugar do tab
   Set language to portuguese &&& mensagens em português
   Set multiple off warning   &&& abrir 1 cópia somente
   Set browsesync on          &&& para o comando browse funcionar ok
   Set tooltipstyle balloon   &&& para mensagem dos campos em forma de balão
   Set menustyle extended     &&& padrão é standard, extended estilo office 2007
   Set programmaticchange off &&& introduzida na build 1.9.94

   define window main at 0, 0 width 500 height 300 ICON "demo.ico" NOTIFYICON "demo.ico" MAIN title [Cupom Fiscal Eletrônico - Sweda] NOSIZE NOMAXIMIZE on init {|| fIniciar(cXml)}

      @ 10, 090 LABEL   Lbl_Ativacao Value [Código de Ativação:]                       WIDTH 150 HEIGHT 20
      @ 10, 220 TEXTBOX Txt_Ativacao Value [] MAXLENGTH 32 WIDTH 250 HEIGHT 20 TOOLTIP "Código de Ativação"

      define button btn_EnviarVenda
         row 50
         col 90
         width 120
         caption [&Venda]
         action {|| fEnviarVenda()}
         DEFAULT .t.
      end button
 
      on key escape action {|| thiswindow.release}
   end window

   main.center()
   main.activate()
Return (Nil)

Procedure fIniciar(cXml)
   If !File([SAT.DLL])
      MsgStop([SAT.dll não encontrada na pasta atual.], [Erro])
      Quit
   Else   
      Ferase(cXml + [.xml])

      If [EM OPERA] $ upper(ConsultarSAT()[3])
         fGerarCfe(cXml)
      Else
         MsgInfo([SAT-CFe: não foi ativado corretamente, tente outra vez...], [Erro])
         Quit
      Endif
   Endif
Return (Nil)

Procedure fGerarCfe(cXml)
   Local i:= 1

   *** Cria o xml
   cXml:= fCria_Xml(cXml)

   *** Identificação da Software House
   fCriaIdentificacao(cXml, [10.xxx.xxx/0001-xx], [yU9BZ/jxcp1daI15deXESFrPECQVNsIdroKZbg9zNkS28svLZUPAtzJ/6F9sLp9NnRRH2VLeitsN8Vw==], 1)

   *** Identificação do Emitente
   fCriaEmitente(cXml, [07.xxx.xxx/0001-xx], [117.xxx.xxx.xxx], [123123], [])

   *** Identificação do Destinatário - obrigatório
   fCriaDestinatario(cXml, [], [])
   *** ou
*   fCriaDestinatario(cXml, [xxx.xxx.xxx-xx], [Marcelo Antonio Lazzaro Carli])
 
   *** Local de Entrega do Destinatário
 *  fCriaEntrega(cXml, [Rua xxxxxxx], [268], [Complemento A], [Jssssss], [São Paulo], [SP])
 
   *** Identificação dos Produtos
   For i:= 1 to 1 //5
       fCriaProduto(cXml, i, strzero(i, 5), [], [Lapis de cor], [85447030], [5102], [un], [1.0000], [0.900], [A], [0.00], [], [], [0], [20], [7.00], [], [])
   Next

   fNode_Xml(cXml, [total/], 10) // fecha a tag ESSA SO FECHA UNICA

   *** Identificação dos Pagamentos
   fCriaPagamento(cXml, [01], [0.90], [])
   
   *** Fechamento do Cfe   
   fCriaFechamento(cXml, [Obrigado e Volte Sempre;Malc Sistemas Agradece.])
Return (Nil)

Procedure fEnviarVenda() 
   Local aRetorno:= {}, iRetorno:= 0
   Private cSecao:= cStatus:= cXML64:= cChave:= cCfeCanc:= cDataHora:= cQrcode:= []

   If len(alltrim(GetProperty([main], [Txt_Ativacao], [Value]))) < 8 .or. len(alltrim(GetProperty([main], [Txt_Ativacao], [Value]))) > 32
      MsgInfo([Código de Ativação de ser entre 8 e 32], [Erro])
      Return (Nil)
   Endif

   aRetorno:= EnviarDadosVenda(nCfe, alltrim(GetProperty([main], [Txt_Ativacao], [Value])), memoread([teste.xml]))

   cStatus := aRetorno[4]
 
   If [SUCESSO] $ UPPER(cStatus)
      cSecao   := aRetorno[1]
      cChave   := aRetorno[9]
      cXML64   := HB_BASE64Decode(aRetorno[7])
      cDatahora:= substr(aRetorno[7], 7, 2) + [/] + substr(aRetorno[7], 5, 2) + [/] + substr(aRetorno[7], 1, 4) + [ - ] + substr(aRetorno[7], 9, 2) + [:] + substr(aRetorno[7], 11, 2) + [:] + substr(aRetorno[7], 13, 2)
      cQrcode  := aRetorno[12]
      Memowrit(cChave + [.xml],  cXML64)

      If MsgYesNo([Cancelar a Última Venda?], [Cancelamento]) == .T.
         cCfeCanc:= '<?xml version="1.0" encoding="UTF-8"?>'
         cCfeCanc+= '<CFeCanc> <infCFe chCanc=CFe"' + cChave + '">'
         cCfeCanc+= '<ide><CNPJ>11111111111111</CNPJ>'  /// da softhouse 
         cCfeCanc+= '<signAC>CQVNsIdroKZbg9zNkS28svLZUPAtzJ/6F9sLp9NnRRH2VLeitsN8Vw==]</signAC>'
         cCfeCanc+= '<numeroCaixa>001</numeroCaixa>'
         cCfeCanc+= '</ide><emit></emit><dest></dest><total></total><infAdic></infAdic></infCFe></CFeCanc>'

*</ide><emit /><dest><CNPJ></CNPJ></dest><total /><infAdic /></infCFe></CFeCanc>

         aRetorno:= CancelarUltimaVenda(Random(999999), alltrim(GetProperty([main], [Txt_Ativacao], [Value])), [CFe] + cChave, cCfeCanc)
         If [SUCESSO] $ UPPER(aRetorno[4])
            MsgInfo([Cancelamento executado com sucesso.])
         Else
            MsgStop([Erro no Cancelamento.] + aRetorno[1] + CRLF + aRetorno[2] + aRetorno[3] + CRLF + aRetorno[4], [Erro])
         Endif           
      Endif
   Else
      MsgInfo(cStatus, [Erro])
   Endif
Return (Nil)

Function fCria_Xml(cXml)
   Local nHandle:= 0

   If !Empty(cXml)
      If (nHandle:= Fcreate(alltrim(cXml) + [.xml], 0)) == -1
         Return (Nil)
      Endif
      Fwrite(nHandle, [<?xml version="1.0" encoding="utf-8" ?>] + CRLF)
      Fwrite(nHandle, [<CFe>] + CRLF)
      Fwrite(nHandle, [     <infCFe versaoDadosEnt="0.06">] + CRLF)
   Endif
Return (nHandle)

Procedure fNode_Xml(cXml, cNomeTag, nEspaco, lFecha)
   Local cRetorno:= []

   Default lFecha  to .F.
   Default nEspaco to 5

   If Empty(cXml)
      Return (Nil)
   Endif

   If !Empty(cNomeTag) .and. !lFecha
      cRetorno:= spac(nEspaco) + [<] + cNomeTag + [>]
   Else
      cRetorno:= spac(nEspaco) + [</] + cNomeTag + [>]
   Endif

   If !Empty(cRetorno )
      Fwrite(cXml, cRetorno + CRLF)
   Endif
Return (Nil)

Procedure fTag_Xml(cXml, cNomeTag, cValor, nEspaco, lFecha)
   Local cRetorno:= []

   Default lFecha  to .T.
   Default nEspaco to 5
   Default cValor  to []

   If Empty(cXml)
      Return (Nil)
   Endif

   cValor:= Rtrim(cValor)

   If !Empty(cValor) .or. lFecha
      cRetorno:= (spac(nEspaco) + [<] + cNomeTag + [>] + cValor + [</] + cNomeTag + [>])
   Endif

   If Empty(cValor)
      cRetorno:= (spac(nEspaco) + [<] + cNomeTag + [ />] )
   Endif

   If !Empty(cRetorno )
      Fwrite(cXml, cRetorno + CRLF)
   Endif
Return (Nil)

Procedure fCriaIdentificacao(cXml, cCnpj, cAssinatura, nCaixa)
   Default cCnpj       to [10.229.311./0001-80]
   Default cAssinatura to []
   Default nCaixa      to 1

   If Empty(cXml)
      Return (Nil)
   Endif

   fNode_Xml(cXml, [ide], 10) // abre a tag
     fTag_Xml(cXml, [CNPJ], CHARREM("/;-:,\.(){}[] ", cCNPJ), 15)
     fTag_Xml(cXml, [signAC], cAssinatura, 15)
     fTag_Xml(cXml, [numeroCaixa], strzero(nCaixa, 3), 15)
   fNode_Xml(cXml, [ide], 10, .T.) // fecha a tag
Return (Nil)

Procedure fCriaEmitente(cXml, cCnpj, cIe, cIm, nTribIssqn, cRatIssqn)
   Default cIm        to [] // Este campo deve ser informado, quando ocorrer a emissão de CF-e conjugada, com prestação de serviços sujeitos ao ISSQN e fornecimento de peças sujeitos ao ICMS
   Default nTribIssqn to 2  // 1-Microempresa Municipal, 2-Estimativa, 3-Sociedade de Profissionais, 4-Cooperativa, 5-Microempresário Individual (MEI)
   Default cRatIssqn  to [N]

   If Empty(cXml)
      Return (Nil)
   Endif

   fNode_Xml(cXml, [emit], 10) // abre a tag
     fTag_Xml(cXml, [CNPJ], CHARREM("/;-:,\.(){}[] ", cCNPJ), 15)
     fTag_Xml(cXml, [IE], CHARREM("/;-:,\.(){}[] ", cIe), 15)
     If !Empty(cIm) // emissão de CF-e conjugada c/ prestação de serviços ao ISSQN e fornecimento de peças sujeitos ao ICMS.
        fTag_Xml(cXml, [IM], CHARREM("/;-:,\.(){}[] ", cIM), 15)
     Endif
     If !Empty(nTribIssqn)
        fTag_Xml(cXml, [cRegTribISSQN], strzero(nTribIssqn, 1), 15)
     Endif
     fTag_Xml(cXml, [indRatISSQN], cRatIssqn, 15)
   fNode_Xml(cXml, [emit], 10, .T.) // fecha a tag
Return (Nil)

Procedure fCriaDestinatario(cXml, cCnpjCpf, cNome)
   Default cCnpjCpf to []
   Default cNome    to []

   If Empty(cXml)
      Return (Nil)
   Endif

   If !Empty(cCnpjCpf) .and. !Empty(cNome)
      fNode_Xml(cXml, [dest], 10) // abre a tag
      If len(cCnpjCpf) == 14
         If !Empty(cCnpjCpf)
            fTag_Xml(cXml, [CNPJ], CHARREM("/;-:,\.(){}[] ", cCnpjCpf), 15)
         Endif
      Else
         If !Empty(cCnpjCpf)
            fTag_Xml(cXml, [CPF], CHARREM("/;-:,\.(){}[] ", cCnpjCpf), 15)
         Endif
      Endif

      If !Empty(cNome)
         fTag_Xml(cXml, [xNome], alltrim(cNome), 15)
      Endif
      fNode_Xml(cXml, [dest], 10, .T.) // fecha a tag
   Else
      fNode_Xml(cXml, [dest/], 10, .F.) // fecha a tag
   Endif
Return (Nil)

Procedure fCriaEntrega(cXml, xLgr, nro, xCpl, xBairro, xMun, cUF) // Informar apenas no caso de entrega da mercadoria em domicílio.
   Default xCpl to []

   If Empty(cXml)
      Return (Nil)
   Endif

   fNode_Xml(cXml, [entrega], 10) // abre a tag
     If !Empty(xLgr)
        fTag_Xml(cXml, [xLgr], alltrim(xLgr), 15)
     Endif
     If !Empty(nro)
        fTag_Xml(cXml, [nro], alltrim(nro), 15)
     Endif
     If !Empty(xCpl)
        fTag_Xml(cXml, [xCpl], alltrim(xCpl), 15)
     Endif
     If !Empty(xBairro)
        fTag_Xml(cXml, [xBairro], alltrim(xBairro), 15)
     Endif
     If !Empty(xMun)
        fTag_Xml(cXml, [xMun], alltrim(xMun), 15)
     Endif
     If !Empty(cUF)
        fTag_Xml(cXml, [UF], cUF, 15)
     Endif
   fNode_Xml(cXml, [entrega], 10, .T.) // fecha a tag
Return (Nil)

Procedure fCriaProduto(cXml, nItem, cProd, cEAN, xProd, NCM, CFOP, uCom, qCom, vUnCom, indRegra, vDesc, vOutro, vItem12741, Orig, CST, pICMS, xCampoDet, xTextoDet)
   Default nItem      to 1
   Default cEAN       to []
   Default cFop       to [5102]
   Default uCom       to [UN]
   Default indRegra   to [A]
   Default vDesc      to [0]
   Default vOutro     to [0]
   Default vItem12741 to [0]
   Default Orig       to [0]  // 0  - Nacional, exceto as indicadas nos códigos 3, 4, 5 e 8;1 - Estrangeira
   Default Cst        to [00] // 00 – Tributada integralmente; 20 – com redução de base de cálculo 90 – Outros
   Default pICMS      to [0]
   Default xCampoDet  to []
   Default xTextoDet  to []

   If Empty(cXml)
      Return (Nil)
   Endif

   qCom:= fDefNumero(qCom, 12, 4)
   If indRegra == [A]  // Valor deve ser arredondado com exceção de operação com combustíveis quando deve ser truncado(Portaria 30/94 do DNC)
      vUnCom:= fDefNumero(vUnCom, 12, 2)
   Else
      vUnCom:= fDefNumero(vUnCom, 11, 3) // Deve ser informado com 3 decimais no caso de combustíveis (Portaria DNC 30/94), para os demais com 2 decimais.
   Endif

   pICMS:= fDefNumero(pICMS, 12, 2)

   fNode_Xml(cXml, [det nItem="] + alltrim(str(nItem, 3)) + ["], 10) // máximo de 500 ítens por cfe
     fNode_Xml(cXml, [prod], 15)
       fTag_Xml(cXml, [cProd], alltrim(cProd), 20)
       If !Empty(cEAN)
          fTag_Xml(cXml, [cEAN], alltrim(cEAN), 20) // Tag Obrigatória para Validador do Governo, mesmo vazia
       Endif
       fTag_Xml(cXml, [xProd], alltrim(fParseXml(xProd)), 20)
       If !Empty(Ncm)
          fTag_Xml(cXml, [NCM], alltrim(Ncm), 20)
       Endif
       If !Empty(cFop)
          fTag_Xml(cXml, [CFOP], alltrim(cFop), 20)
       Endif
       fTag_Xml(cXml, [uCom], alltrim(fParseXml(Ucom)), 20)
       fTag_Xml(cXml, [qCom], qCom, 20)
       fTag_Xml(cXml, [vUnCom], vUnCom, 20)
       fTag_Xml(cXml, [indRegra], indRegra, 20)
       If val(vDesc) > 0
          vDesc     := fDefNumero(vDesc,  12, 2)
          fTag_Xml(cXml, [vDesc], vDesc, 20)
       Endif
       If val(vOutro) > 0
          vOutro    := fDefNumero(vOutro, 12, 2)
          fTag_Xml(cXml, [vOutro], vOutro, 20)
       Endif
       If !Empty(vItem12741)  // obrigatório, caso o contribuinte não opte por informar o valor em painel afixado no estabelecimento
          vItem12741:= fDefNumero(vItem12741, 12, 2)
          fTag_Xml(cXml, [vItem12741], vItem12741, 20)
       Endif 
     fNode_Xml(cXml, [prod], 15, .T.) // fecha a tag

     If !Empty(xCampoDet)
        fNode_Xml(cXml, [obsFiscoDet], 15)
        If !Empty(xCampoDet)
           fTag_Xml(cXml, [xCampoDet], xCampoDet, 20)
        Endif
        If !Empty(xTextoDet)
           fTag_Xml(cXml, [xTextoDet], xTextoDet, 20)
        Endif
        fNode_Xml(cXml, [obsFiscoDet], 15, .T.)
     Endif
       fNode_Xml(cXml, [imposto], 15)

         fNode_Xml(cXml, [ICMS], 20)
           fNode_Xml(cXml, [ICMS00], 25)
             fTag_Xml(cXml, [Orig], Orig, 30)
             fTag_Xml(cXml, [CST], CST, 30)
             fTag_Xml(cXml, [pICMS], pICMS, 30)
           fNode_Xml(cXml, [ICMS00], 25, .T.) // fecha a tag
         fNode_Xml(cXml, [ICMS], 20, .T.) // fecha a tag

         fNode_Xml(cXml, [PIS], 20)
           fNode_Xml(cXml, [PISNT], 25)
             fTag_Xml(cXml, [CST], [08], 30)
           fNode_Xml(cXml, [PISNT], 25, .T.) // fecha a tag
*           fNode_Xml(cXml, [PISAliq], 25)
*             fTag_Xml(cXml, [CST], [02], 30)
*             fTag_Xml(cXml, [vBC], [000000000001.00], 30)
*             fTag_Xml(cXml, [pPIS], [0.0500], 30)
*           fNode_Xml(cXml, [PISAliq], 25, .T.) // fecha a tag
         fNode_Xml(cXml, [PIS], 20, .T.) // fecha a tag

         fNode_Xml(cXml, [COFINS], 20)
           fNode_Xml(cXml, [COFINSNT], 25)
             fTag_Xml(cXml, [CST], [08], 30)
           fNode_Xml(cXml, [COFINSNT], 25, .T.) // fecha a tag
*           fNode_Xml(cXml, [COFINSOutr], 25)
*             fTag_Xml(cXml, [CST], [99], 30)
*             fTag_Xml(cXml, [vBC], [1.00], 30)
*             fTag_Xml(cXml, [pCOFINS], [5.0000], 30)
*           fNode_Xml(cXml, [COFINSOutr], 25, .T.) // fecha a tag
         fNode_Xml(cXml, [COFINS], 20, .T.) // fecha a tag

     fNode_Xml(cXml, [imposto], 15, .T.) // fecha a tag
   fNode_Xml(cXml, [det], 10, .T.) // fecha a tag
Return (Nil)

Procedure fCriaPagamento(cXml, cMP, vMP, cAdmC)
   Default cMP   to [01]
   Default cAdmC to [012] // Cielo 999 outros

   If Empty(cXml)
      Return (Nil)
   Endif

   /* cMp - Meios de Pagamento
      01 - Dinheiro
      02 - Cheque
      03 - Cartão de Crédito
      04 - Cartão de Débito
      05 - Crédito Loja
      10 - Vale Alimentação
      11 - Vale Refeição
      12 - Vale Presente
      13 - Vale Combustível
      99 - Outros
   */

   /* cAdmC - Código da Credenciadora de cartão de débito ou crédito
      Código da Credenciadora de cartão de débito ou crédito
      conforme tabela disponível no Anexo 2 – Tabelas de códigos de UF e
      Município. Exemplos: 001, 002, 003.
   */
   If !Empty(cMP)
      fNode_Xml(cXml, [pgto], 10) // abre a tag
       fNode_Xml(cXml, [MP], 15) // abre a tag
         fTag_Xml(cXml, [cMP], cMP, 20) 
         fTag_Xml(cXml, [vMP], vMP, 20)
         If !Empty(cAdmC)
            fTag_Xml(cXml, [cAdmC], cAdmC, 20)
         Endif
       fNode_Xml(cXml, [MP], 15, .T.) // fecha a tag
      fNode_Xml(cXml, [pgto], 10, .T.) // fecha a tag
   Endif
Return (Nil)

Procedure fCriaFechamento(cXml, infCpl)
   Default infCpl to [Obrigado e Volte Sempre.; Agradecemos a Preferência.]

   If Empty(cXml)
      Return (Nil)
   Endif

   fNode_Xml(cXml, [infAdic], 10) // abre a tag
     fTag_Xml(cXml, [infCpl], infCpl, 15)
   fNode_Xml(cXml, [infAdic], 10, .T.) // fecha a tag

   Fwrite(cXml, [     </infCFe>] + CRLF)
   Fwrite(cXml, [</CFe>])
   Fclose(cXml)
Return (Nil)

Static Function fDefNumero(xVar, nLen, nDecimal)
   Local xRet
 
   DEFAULT nDecimal TO 2

   If Valtype(xVar) == [N]
      xRet:= ltrim(str(xVar, nLen, nDecimal))
   ElseIf Valtype(xVar) == [C]
      xRet:= CHARREM(", ", xVar)
   Endif

   If Empty(xRet)
      xRet:= ltrim(str(0, nLen, nDecimal))
   Endif
Return (xRet)

Static Function fParseXml(cTxt)
   Local i, aCmd:= {{">", "<"}, {"<", "&qt;"}, {"&", "&"}, {'"' , """}, {"'", "'"}}

   For i:= 1 to len(aCmd)
       If at(aCmd[i, 1], cTxt) > 0
          cTxt:= strtran(cTxt, aCmd[i, 1], aCmd[i, 2])
       Endif
   Next
Return (cTxt)

***********************************************************************************
* 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
Att.

Marcelo A. L. Carli
Marília/SP
Capital Nacional do Alimento ®

http://marcelo.lx.com.br
http://www.marazambon.blogspot.com/
Email / Skype: malcarli@life.com.br

******************************************************************************
Se for repassar, apague o meu nome e endereço.
Ajude a combater a propagação de vírus e spams
coloque TODOS os destinatários em CÓPIA OCULTA (Cco / Bcc)
******************************************************************************

SAT-Fiscal a mistica está desvendada.

Enviado: 21 Set 2015 10:07
por Marcelo.1505
Farei os testes hoje!
Sexta feira o dia foi impossível.

Vou verificar como procederei, pois o sistema em questão ainda roda em modo console.
Nem que eu tenha que gerar uma nova aplicação apenas para o SAT.

Mais uma vez grato pelas informações!

SAT-Fiscal a mistica está desvendada.

Enviado: 21 Set 2015 14:29
por Marcelo.1505
Vamos lá.
Seguindo as rotinas e dicas disponibilizadas pelo Rochinha, criei um novo projeto.
O Código utilizado é basicamente o disponibilizado, pois quero primeiramente fazer acontecer a comunicação entre o meu Sistema e o Emulador SAT e depois é só integrar ao meu sistema.

Código teste:

Código: Selecionar todos

#include "hmg.ch"
#include "dll.ch"

function Main()
 PUBLIC hACBrDLL
 cPath := cFilePath( GetModuleFileName( GetInstance() ) ) // Pega o caminho exato onde se encontra o sistema.

 // A SAT.dll pode estar na pasta do seu sistema
 ? "SAT.dll carregada",;
 hACBrDLL := LoadLibrary( cPath+"SAT.DLL" )

 ? "ConsultarSAT",;
 ConsultarSAT( Random( 999999 ) ) //[3]
 
 ? "AtivarSAT",;
 AtivarSAT( Random( 999999 ), 1, "123456", "11111111111111", 35 ) //[3]

 cCFeTeste := MemoRead( cPath+"CFeTeste.xml" )

 aRetorno := EnviarDadosVenda( Random( 999999 ), "123456", cCFeTeste )
 ? "EnviarDadosVenda",aRetorno[1],aRetorno[2],aRetorno[3],aRetorno[4]

 return nil


Function ConsultarSAT( nSessionRandom )
 cString := SATConsultar( nSessionRandom )
 return StringToArray( cString, "|" ) 

Function AtivarSAT( numeroSessao, subComando, codigoDeAtivacao, CNPJ, cUF )
 cString := SATAtivar( numeroSessao, subComando, codigoDeAtivacao, CNPJ, cUF )
 return StringToArray( cString, "|" ) 

Function DesligarSAT()
 cString := SATDesligar()
 return StringToArray( cString, "|" ) 

Function ConsultarNumeroSessao( nSessionRandom, codigoAtivacao, numeroSessao )
 cString := SATConsultarNumeroSessao( nSessionRandom, codigoAtivacao, numeroSessao )
 return StringToArray( cString, "|" ) 

Function TesteFimAFim()
 cString := SATTesteFimAFim()
 return StringToArray( cString, "|" ) 

Function EnviarDadosVenda( numeroSessao, codigoAtivacao, dados )
 cString := SATEnviarDadosVenda( numeroSessao, codigoAtivacao, dados )
 return StringToArray( cString, "|" ) 

Function CancelarUltimaVenda( numeroSessao, codigoAtivacao, chaveAcesso, dados )
 cString := SATCancelarUltimaVenda( numeroSessao, codigoAtivacao, chaveAcesso, dados )
 return StringToArray( cString, "|" ) 


/* OK */ DLL32 FUNCTION SATConsultar( 123654 AS _INT ) AS STRING PASCAL FROM "ConsultarSAT" LIB hACBrDLL
/* OK */ DLL32 FUNCTION SATAtivar( numeroSessao AS _INT, subComando AS _INT, codigoDeAtivacao AS STRING, CNPJ AS STRING, cUF AS _INT ) AS STRING PASCAL FROM "AtivarSAT" LIB hACBrDLL
/* OK */ DLL32 FUNCTION SATDesligar() AS STRING PASCAL FROM "DesligarSAT" LIB hACBrDLL
/* OK */ DLL32 FUNCTION SATConsultarNumeroSessao(getRandom AS _INT, codigoAtivacao AS STRING, numeroSessao AS STRING) AS STRING PASCAL FROM "ConsultarNumeroSessao" LIB hACBrDLL
DLL32 FUNCTION SATTesteFimAFim(numeroSessao AS _INT, codigoAtivacao AS STRING, dados AS STRING) AS STRING PASCAL FROM "TesteFimAFim" LIB hACBrDLL
/* OK */ DLL32 FUNCTION SATEnviarDadosVenda(numeroSessao AS _INT, codigoAtivacao AS STRING, dados AS STRING) AS STRING PASCAL FROM "EnviarDadosVenda" LIB hACBrDLL
/* OK */ DLL32 FUNCTION SATCancelarUltimaVenda(numeroSessao AS _INT, codigoAtivacao AS STRING, chaveAcesso AS STRING, dados AS STRING) AS STRING PASCAL FROM "CancelarUltimaVenda" LIB hACBrDLL


Function Random( nMaximo )
 static nRandom
 local nTemporal
 nMaximo = if( nMaximo == NIL, 65535, nMaximo )
 if nRandom == NIL
   nRandom = seconds()
 endif
 nTemporal = ( nRandom * seconds() ) % ( nMaximo + 1 )
 nTemporal = if( nTemporal < 1, 1, nTemporal )
 nRandom = nTemporal + seconds()
 RETURN int( nTemporal )


function StringToArray( cString, cSeparator ) 
 LOCAL nPos 
 LOCAL aString := {} 
 DEFAULT cSeparator := ";" 
 cString := ALLTRIM( cString ) + cSeparator 
 DO WHILE .T. 
   nPos := AT( cSeparator, cString ) 
   IF nPos = 0 
    EXIT 
   ENDIF 
   AADD( aString, SUBSTR( cString, 1, nPos-1 ) ) 
   cString := SUBSTR( cString, nPos+1 ) 
 ENDDO 
 RETURN ( aString ) 

O arquivo DLL.CH é o seguinte:

Código: Selecionar todos

#ifndef _DLL_CH
#define _DLL_CH

#define VOID    0
#define BYTE    1
#define CHAR    2
#define WORD    3
#define INT     4
#define BOOL    5
#define HDC     6
#define LONG    7
#define STRING  8
#define LPSTR   9
#define PTR    10

#xcommand DLL FUNCTION <FuncName>( [ <uParam1> AS <type1> ] ;
                                   [, <uParamN> AS <typeN> ] ) ;
             AS <return> [<pascal:PASCAL>] LIB <*DllName*> ;
       => ;
          function <FuncName>( [<uParam1>] [,<uParamN>] ) ;;
             local hDLL := LoadLibrary( <(DllName)> ) ;;
             local cFarProc ;;
             local uResult ;;
             if hDLL != 0 ;;
                cFarProc = GetProcAddress( hDLL, <(FuncName)>, [<.pascal.>], <return>, <type1> [,<typeN>] ) ;;
                uResult = CallDLL( cFarProc, [<uParam1>] [,<uParamN>] ) ;;
                FreeLibrary( hDLL ) ;;
             end ;;
          return uResult

#endif


#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
Porém, ao compilar o mesmo (Utilizo a "HMG IDE Roberto Lopez") me deparo com um erro de sintaxe:
J:/HMG/SAT/SAT.prg(55) Error E0030 Syntax error "syntax error at '('"
J:/HMG/SAT/SAT.prg(56) Error E0030 Syntax error "syntax error at '('"
J:/HMG/SAT/SAT.prg(58) Error E0030 Syntax error "syntax error at '('"
J:/HMG/SAT/SAT.prg(59) Error E0030 Syntax error "syntax error at '('"
J:/HMG/SAT/SAT.prg(60) Error E0030 Syntax error "syntax error at '('"
J:/HMG/SAT/SAT.prg(61) Error E0030 Syntax error "syntax error at '('"


Sendo que a única linha que não da erro na função DLL32 é a linha 57 que não contém parâmetro nenhum.
Para efeito de teste, já troquei os formatos dos parâmetros, e continua o erro.
Pareço estar sendo redundante, ja testei todas as maneiras que eu conheço, mas nada ainda. Até por isso, cheguei a tentar chamar a DLl diretamente do meu sistema.

A título de informação, baixei o Harbour 3.0 para testar, e ao compilar deu o mesmo erro. Será que pode ser alguma coisa na versão que utilizei? Por ser modo Console? Não consigo enxergar onde esta o meu erro... Sorry!