Ir para conteúdo
  • Cadastre-se

dev botao

Erro de impressão -10


Ver Solução Respondido por oribeiro,
  • Este tópico foi criado há 1486 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado
Em 28/09/2020 at 16:25, Rafael Dias disse:

Esta na lista de tarefas desta semana.

Rafael, 

Apenas para te dar uma informação adicional, eu terminei hoje a rotina de Conhecimento de Transporte com a ACBrCTe32.DLL e o erro de impressão é o mesmo, ou seja, se eu imprimo um CT-e, não consigo imprimir depois uma NF-e nem um SAT sem antes sair do sistema e entrar novamente.

Oscar Ribeiro

OASyS Informática

Postado
Em 28/09/2020 at 16:25, Rafael Dias disse:

Esta na lista de tarefas desta semana.

Rafael, 

Apenas para te dar uma informação adicional, eu terminei hoje a rotina de Conhecimento de Transporte com a ACBrCTe32.DLL e o erro de impressão é o mesmo, ou seja, se eu imprimo um CT-e, não consigo imprimir depois uma NF-e nem um SAT sem antes sair do sistema e entrar novamente.

Para te manter posicionado, hoje eu tentei usar todos os comandos de limpeza de memória e de DLL carregadas, e também tentei fazer a chamada da lib PosPrinter após a impressão da NFe para ver se libera o SAT, mas não deu.

    *
    oDll := DllLoad( 'ACBrPosPrinter32.dll' )
    hResult := DllCall(oDll, DLL_STDCALL, "POS_Inicializar", hb_StrToUTF8("ACBrLib.Ini"), hb_StrToUTF8(""))
    hResult := DllCall(oDll, DLL_STDCALL, "POS_Finalizar")
    DllUnload(oDll)
    *
    SET RESOURCES TO
    GlobalFree()
    Release All
    SysRefresh()
    Clear Memory
    Memory(-1)      // Libera memoria que foi alocada por variáveis que não estão mais em uso
    Hb_GCall( .T. ) // Tira sugeira da memória
    *

 

Oscar Ribeiro

OASyS Informática

  • 2 semanas depois ...
Postado

Boa tarde, meu amigo. Obrigado. Se eu pegar os fontes do trunk2 e compilar é a mesma coisa que baixar a DLL no fórum do ACBr?

Oscar Ribeiro

OASyS Informática

Postado
4 horas atrás, Rafael Dias disse:

Cara eu fiz teste com a ultima versão da LIB imprimindo NFe e depois SAT os 2 usando o Fortes Reports e não tive problema, poderia testar com as ultimas versões da LIB.

Rafael,

Baixei todos os fontes e compilei com o Lazarus, realmente notei que você alterou alguns fontes do ACBrPosPrinter e também do Sat, mas o erro continua o mesmo.

Se eu imprimo o SAT e depois vou imprimir a NFe dá erro: "Failet to create win32 control, error: 0".

Você pode, por favor, colocar as suas novas DLLs na mesma pasta que a aplicação anexa e rodar para verificar o erro?

 

samples.zip

Oscar Ribeiro

OASyS Informática

Postado

Cara seu programa não roda aqui da erro, outra coisa que vi tu colocou no uma config errada na configuração de logo.

Citar

PathLogo=c:\windows\temp

e o correto seria

Citar

PathLogo=c:\windows\temp\logo.bmp

Isso pode ser o motivo do seu erro, ele tentar ler o logo para criar a imagem mais não so tem o path.

 

Postado (editado)
10 horas atrás, Rafael Dias disse:

Cara seu programa não roda aqui da erro, outra coisa que vi tu colocou no uma config errada na configuração de logo.

e o correto seria

Isso pode ser o motivo do seu erro, ele tentar ler o logo para criar a imagem mais não so tem o path.

Rafael, 

Não estou imprimindo o logo nem na DANFe nem no extrato do SAT, não dá erro quando eu só imprimo NFe ou só imprimo SAT, mas de qualquer forma, eu segui a sua orientação e tirei o path do logo do ACBRLib.ini.

Meu programa exemplo é muito simples mas eu não enviei as DLL juntas para não disponibilizá-las aqui no fórum, achei que não poderia fazer isso. Mas se você colocar as duas DLLs ACBRNFE32.DLL e ACBRSAT32.DLL na mesma pasta onde você abrir o programa que lhe enviei, acho que conseguirá executar. Testei aqui em vários equipamentos e ele roda.

Segue o código que escrevi.

#include 'FIVEWIN.CH'
#define DLL_CDECL   0x08
#define DLL_STDCALL 0x20
#define DLL_SYSTEM  0x04
#define STR_LEN     256

function Main()
   local oWnd
   define window oWnd from 5,5 to 30,85 title "ACBrLib Teste"
   @ 3,10 BUTTON "Imprime NF-e" size 100,50 OF oWnd ACTION Imprimir()
   @ 3,40 BUTTON "Imprime SAT"  size 100,50 OF oWnd ACTION ImprimirExtratoVenda()
   set message of oWnd to "Teste ACBrLib" date time noinset
   activate window oWnd centered
return nil

function Imprimir(eArquivoOuXml, cImpressora, nNumCopias, cProtocolo, bMostrarPreview, cMarcaDagua, bViaConsumidor, bSimplificado)
    local hResult, bufferLen, buffer, oErr
    local oDll := DllLoad( 'ACBrNFe32.dll' )
    eArquivoOuXml   := if(eArquivoOuXml=nil, "acbrnfe.xml", eArquivoOuXml)
    cImpressora     := if(cImpressora=nil, "", cImpressora)
    nNumCopias      := if(nNumCopias=nil, 1, nNumCopias)
    cProtocolo      := if(cProtocolo=nil, "", cProtocolo)
    bMostrarPreview := if(bMostrarPreview=nil, "True", bMostrarPreview)
    cMarcaDagua     := if(cMarcaDagua=nil, "", cMarcaDagua)
    bViaConsumidor  := if(bViaConsumidor=nil, "", bViaConsumidor)
    bSimplificado   := if(bSimplificado=nil, "", bSimplificado)
    hResult := DllCall(oDll, DLL_STDCALL, "NFE_Inicializar", hb_StrToUTF8("ACBrLib.Ini"), hb_StrToUTF8(""))
    hResult := DllCall(oDll, DLL_STDCALL, "NFE_CarregarXML", hb_StrToUTF8(eArquivoOuXml))
    hResult := DllCall(oDll, DLL_STDCALL, "NFE_Imprimir", hb_StrToUTF8(cImpressora), nNumCopias, hb_StrToUTF8(cProtocolo), hb_StrToUTF8(bMostrarPreview), hb_StrToUTF8(cMarcaDagua), hb_StrToUTF8(bViaConsumidor), hb_StrToUTF8(bSimplificado))
    if !Empty(hResult)
       bufferLen := STR_LEN
       buffer    := Space(bufferLen)
       oErr := DllCall(oDll, DLL_STDCALL, "NFE_UltimoRetorno", @buffer, @bufferLen)
       MsgStop(buffer, "Erro: "+Str(hResult))
    endif
    DllCall(oDll, DLL_STDCALL, "NFE_Finalizar")
    DllUnload(oDll)
return

function ImprimirExtratoVenda(eArquivoOuXml, cImpressora)
    local hResult, bufferLen, buffer, oErr
    local oDll := DllLoad( 'ACBrSat32.dll' )
    eArquivoOuXml   := if(eArquivoOuXml=nil, "acbrsat.xml", eArquivoOuXml)
    cImpressora     := if(cImpressora=nil, "", cImpressora)
    hResult := DllCall(oDll, DLL_STDCALL, "SAT_Inicializar", hb_StrToUTF8("ACBrLib.Ini"), hb_StrToUTF8(""))
    hResult := DllCall(oDll, DLL_STDCALL, "SAT_ImprimirExtratoVenda", hb_StrToUTF8(eArquivoOuXml), hb_StrToUTF8(cImpressora))
    if !Empty(hResult)
       bufferLen := STR_LEN
       buffer    := Space(bufferLen)
       oErr := DllCall(oDll, DLL_STDCALL, "SAT_UltimoRetorno", @buffer, @bufferLen)
       MsgStop(buffer, "Erro: "+Str(hResult))
    endif
    DllCall(oDll, DLL_STDCALL, "SAT_Finalizar")
    DllUnload(oDll)
return

 

Editado por oribeiro

Oscar Ribeiro

OASyS Informática

Postado

Rafael,

Muito obrigado pelo seu esforço em me ajudar.

Coloquei numa pasta o aplicativo que lhe enviei com as duas DLLs e executei.

Montei um vídeo para você ver o que acontece aqui em qualquer equipamento que eu executo esse mesmo exemplo.

 

Video_Exemplo.zip

Oscar Ribeiro

OASyS Informática

Postado

Meu amigo, aí ficou difícil heim!

Parece que o problema está com o uso da DLL com o Fivewin para xHarbour.

O pior é que eu não sei nem por onde começar a procurar a solução porque lá no fórum do Fivewin parece que não estão utilizando ainda a DLL. Eu queria deixar tudo funcionando para incentivá-los porque me parece ser muito superior ao uso do monitor. Além das duas DLLs: ACBrNFe32.dll e ACBrSAT32.dll, há alguma outra DLL ou LIB que precisa estar na mesma pasta do programa? Notei no seu video que há outras DLLs lá.

Oscar Ribeiro

OASyS Informática

Postado

Rafael, deixa eu comentar algo positivo:

Coloquei esse problema no fórum do Fivewin para ver se alguém dá alguma luz sobre o que pode estar interferindo no bom funcionamento da DLL nessa plataforma.

Quem sabe alguma alma boa nos dá alguma luz.

Oscar Ribeiro

OASyS Informática

Postado

Bom dia, Rafael.

Estou feliz pelo seu envolvimento nesse assunto e pelo seu interesse em ajudar. Nós ainda vamos chegar lá. Risos

Eu troquei para CDECL mas deu o mesmo resultado.

Notei que qualquer outra função das DLLs funcionam em conjunto, por exemplo: Posso enviar email pelas duas DLLs no mesmo progrma, enviar NFe e logo depois criarCFe. Não dá erro. O único problema é a impressão. Não consigo ImprimirNFe e depois imprimir o ExtratoSAT sem ter que sair do programa e entrar novamente.

Eu tenho algum problema somente com a impressão que parece deixar algo preso na memória que causa esse impedimento.

#include 'FIVEWIN.CH'
#define DLL_CDECL   0x08
#define DLL_STDCALL 0x20
#define DLL_SYSTEM  0x04
#define STR_LEN     256

function Main()
   local oWnd
   define window oWnd from 5,5 to 30,85 title "ACBrLib Teste"
   @ 3,10 BUTTON "Imprime NF-e" size 100,50 OF oWnd ACTION ImprimirNFE()
   @ 3,40 BUTTON "Imprime SAT"  size 100,50 OF oWnd ACTION ImprimirSAT()
   set message of oWnd to "Teste ACBrLib" date time noinset
   activate window oWnd centered
return nil

static function ImprimirNFE(eArquivoOuXml, cImpressora, nNumCopias, cProtocolo, bMostrarPreview, cMarcaDagua, bViaConsumidor, bSimplificado)
    local hResult, bufferLen, buffer, oErr
    local oDll := DllLoad( 'ACBrNFe32.dll' )
    eArquivoOuXml   := if(eArquivoOuXml=nil, "acbrnfe.xml", eArquivoOuXml)
    cImpressora     := if(cImpressora=nil, "", cImpressora)
    nNumCopias      := if(nNumCopias=nil, 1, nNumCopias)
    cProtocolo      := if(cProtocolo=nil, "", cProtocolo)
    bMostrarPreview := if(bMostrarPreview=nil, "True", bMostrarPreview)
    cMarcaDagua     := if(cMarcaDagua=nil, "", cMarcaDagua)
    bViaConsumidor  := if(bViaConsumidor=nil, "", bViaConsumidor)
    bSimplificado   := if(bSimplificado=nil, "", bSimplificado)
    hResult := DllCall(oDll, DLL_CDECL, "NFE_Inicializar", hb_StrToUTF8("ACBrLib.Ini"), hb_StrToUTF8(""))
    hResult := DllCall(oDll, DLL_CDECL, "NFE_CarregarXML", hb_StrToUTF8(eArquivoOuXml))
    hResult := DllCall(oDll, DLL_CDECL, "NFE_Imprimir", hb_StrToUTF8(cImpressora), nNumCopias, hb_StrToUTF8(cProtocolo), hb_StrToUTF8(bMostrarPreview), hb_StrToUTF8(cMarcaDagua), hb_StrToUTF8(bViaConsumidor), hb_StrToUTF8(bSimplificado))
    if !Empty(hResult)
       bufferLen := STR_LEN
       buffer    := Space(bufferLen)
       oErr := DllCall(oDll, DLL_CDECL, "NFE_UltimoRetorno", @buffer, @bufferLen)
       MsgStop(buffer, "Erro: "+Str(hResult))
    endif
    DllCall(oDll, DLL_CDECL, "NFE_Finalizar")
    DllUnload(oDll)
return nil

static function ImprimirSAT(eArquivoOuXml, cImpressora)
    local hResult, bufferLen, buffer, oErr
    local oDll := DllLoad( 'ACBrSat32.dll' )
    eArquivoOuXml   := if(eArquivoOuXml=nil, "acbrsat.xml", eArquivoOuXml)
    cImpressora     := if(cImpressora=nil, "", cImpressora)
    hResult := DllCall(oDll, DLL_CDECL, "SAT_Inicializar", hb_StrToUTF8("ACBrLib.Ini"), hb_StrToUTF8(""))
    hResult := DllCall(oDll, DLL_CDECL, "SAT_ImprimirExtratoVenda", hb_StrToUTF8(eArquivoOuXml), hb_StrToUTF8(cImpressora))
    if !Empty(hResult)
       bufferLen := STR_LEN
       buffer    := Space(bufferLen)
       oErr := DllCall(oDll, DLL_CDECL, "SAT_UltimoRetorno", @buffer, @bufferLen)
       MsgStop(buffer, "Erro: "+Str(hResult))
    endif
    DllCall(oDll, DLL_CDECL, "SAT_Finalizar")
    DllUnload(oDll)
return nil

 

Tentei com os três e tentei colocar a NFe com um código e o SAT com outro. O resultado foi o mesmo.

#define DLL_CDECL   0x08
#define DLL_STDCALL 0x20
#define DLL_SYSTEM  0x04

 

erro.png

Oscar Ribeiro

OASyS Informática

Postado

Rafael, 

Coloquei o problema no site ClipperBr e no do Fivewin e todos estão com o mesmo problema.

Não conseguimos imprimir NFe e SAT no mesmo sistema sem precisar sair e entrar novamente. Alguma coisa fica na memória quando se usa o comando imprime dentro de um DLL do ACBr que impede a impressão em outra DLL do próprio ACBr.

Via programação já tentei de tudo. 

Oscar Ribeiro

OASyS Informática

Postado

Obrigado Daniel, eu não sei nem por onde começar a mexer nos fontes e só falta isso para começarmos a utilizar as DLL em vez do monitor.

As DLLs ficaram muito boas, o processo fica muito rápido dentro da aplicação sem a necessidade da troca de arquivos com o monitor.

Parabéns aos desenvolvedores pelo excelente trabalho.

Oscar Ribeiro

OASyS Informática

  • Solution
Postado

Rafael,

Encontrei uma solução. 

Se eu não descarregar a biblioteca da memória, ou seja se eu não usar o DllUnload( oDll ), funciona tudo perfeitamente!

Essas bibliotecas da ACBr são um show. 

Muito obrigado.

  • Curtir 4
  • Obrigado 1

Oscar Ribeiro

OASyS Informática

  • Moderadores
Postado

Obrigado por reportar. 
Fechando o tópico. Para nova dúvida abra um novo tópico. 


logoacbr.pngConheça o Portal do Projeto ACBr

Ajude o Projeto ACBr crescer - Assine o SAC ACBr
Assine um dos planos de longa duração do SAC ACBr, obtenha Descontos Especiais, Parcele no Cartão e ainda ganhe Brindes Exclusivos. Saiba mais aqui

Conheça o ACBrLib, o ACBr de forma nativa para qualquer linguagem de programação. Saiba mais aqui

 

 

 

 

  • Este tópico foi criado há 1486 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.