Ir para conteúdo
  • Cadastre-se

dev botao

Cache acbrlib


Ver Solução Respondido por EMBarbosa,

Recommended Posts

  • Membros Pro
Postado (editado)

Estou usando acbrLibNfe + node + openssl 1.1.x + MT + Cdecl ou StdCall (testei ambos)

Carrego a lib atraves de uma função igual a do DEMO node

const path = require('path')
const ffi = require('ffi-napi')
const ref = require('ref-napi')
const fs = require('fs')
import { Request, Response } from 'express'
import { checkVersion } from '../utils/checkVersion'
 
// const pathDllACBrLibNFeCdecl = path.join(__dirname, '../../../libs/acbr/ACBrLibNFe/bin/MT/Cdecl/ACBrNFe64.dll') // 64 bits
const pathDllACBrLibNFeStdCall = path.join(__dirname, '../../../libs/acbr/ACBrLibNFe/bin/MT/StdCall/ACBrNFe64.dll') // 64 bits
 
//export const buflength = 1024 * 16
export const buflength = 256
 
export const getLibNfe = async (): Promise<any> => {
    const libm = await ffi.Library(pathDllACBrLibNFeStdCall, {
        NFE_Inicializar: ['int', ['pointer', 'string', 'string']],
        NFE_Finalizar: ['int', ['pointer']],
        NFE_CarregarINI: ['int', ['pointer', 'string']],
        NFE_StatusServico: ['int', ['pointer', 'string', 'string']],
        NFE_UltimoRetorno: ['int', ['pointer', 'string', 'string']],
        NFE_Nome: ['int', ['pointer', 'string', 'string']],
        NFE_Versao: ['int', ['pointer', 'string', 'string']],
 
        NFE_ConfigLer: ['int', ['pointer', 'string']],
        NFE_ConfigGravar: ['int', ['pointer', 'string']],
        NFE_ConfigLerValor: ['int', ['pointer', 'string', 'string', 'string', 'string']],
        NFE_ConfigGravarValor: ['int', ['pointer', 'string', 'string', 'string']],
        NFE_ConfigImportar: ['int', ['pointer', 'string']],
        NFE_ConfigExportar: ['int', ['pointer', 'string', 'string']],
 
        NFE_ObterCertificados: ['int', ['pointer', 'string', 'string']],
        NFE_CarregarXML: ['int', ['pointer', 'string']],
        NFE_SalvarPDF: ['int', ['pointer', 'string', 'string']]
    })
    return libm
}


Em seguida inicio e gero o INI usando esta rotina
 

export const statusServico = async (certificate: TPfx): Promise<any> => {
    const lib = await getLibNfe()
 
    let handle = ref.alloc('pointer')
    let aloc_sResposta = Buffer.alloc(buflength)
    let aloc_esTamanho = ref.alloc('int', buflength)
 
    handle = await inicializarBiblioteca(lib, handle)
 
   await configGravar(lib, handle)
}
 
export const configGravar = async (lib: any, handle: any): Promise<any> => {
    const dateAndHoursAA_MM_DD_HH_MM_SS = new Date().toISOString().replace(/:/g, '-')
    const iniPathGravar = path.resolve(__dirname, `../../logsIni/ACBrNFeServicosGravar${dateAndHoursAA_MM_DD_HH_MM_SS}.ini`)
 
    // NFE_ConfigGravar
    const retNFE_ConfigGravar = await lib.NFE_ConfigGravar(handle, iniPathGravar)
    if (retNFE_ConfigGravar !== 0) {
        const errorMessageResult = await errorMessage(handle, lib, retNFE_ConfigGravar)
        console.log('errorMessageResult: ', errorMessageResult)
        throw new Error(errorMessageResult)
    }
 
    return ''
}
async function inicializarBiblioteca(lib: any, handle: any): Promise<any> {
    const arqConfigFile = ''
    const retInicializar = await lib.NFE_Inicializar(handle, arqConfigFile, '')
    if (retInicializar !== 0) {
        throw new Error(`Falha ao inicializar: ${errorMessage(handle, lib, retInicializar)}`)
    }
    return ref.readPointer(handle, 0, buflength)
}
 
async function finalizarBiblioteca(lib: any, handle: any): Promise<any> {
    await lib.NFE_Finalizar(handle)
}


o que acho estranho é que sempre o ini gerado é igual ao anterior mesmo que eu reinicie a maquina parece que fica gravadoAnalisei a documentação mas não vejo o motivoremovi os ini das pastas para nao carregar automatico mas o cache continuao que me aconselhariamMuito obrigadohttps://acbr.sourceforge.io/ACBrLib/NFE_Inicializar.html

o metodo que uso para pegar as configurações da dll e gerar o ini é NFE_ConfigGravar

 

Editado por Renan Kemp
Link para o comentário
Compartilhar em outros sites

  • Consultores
  • Solution

Olá Renan, tudo blz?

Em 13/01/2024 at 08:13, Renan Kemp disse:

Cdecl ou StdCall (testei ambos)

   Isso não tem nada a ver com o problema, mas veja a seguinte informação: https://acbr.sourceforge.io/ACBrLib/CdeclouStdCallqualusar.html

   Você deve escolher o que for compatível com seu sistema e "ambiente destino" (aonde o sistema for executado).

Em 13/01/2024 at 08:13, Renan Kemp disse:

Em seguida inicio e gero o INI usando esta rotina

 Essa parte do código não me parece fazer nenhuma referência ao INI. Se fizer, me desculpe, pois node.js não é minha especialidade. Mas me aponte exatamente qual linha faz isso.

 

Em 13/01/2024 at 08:23, Renan Kemp disse:

eu sei que esta com cache por que sempre que o ini é gerado vem com a tag preenchida como fiz la atras, ja reinicie a maquina e persiste

[Sistema]
Nome=testeRenan

A princípio, me parece que você está utilizando um mesmo arquivo escrito anteriormente. O arquivo .INI deve ter sido salvo no HD e, é claro, reiniciar a máquina por si só não vai apagar o conteúdo dele.

Verifique no seu código onde você passa o arquivo .INI qual o caminho. Daí veja se o arquivo já não está salvo no HD.

 

  • Curtir 3

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Olá tudo bem

Sobre StdCall e Cdecl:

Eu entendi que em node depende de onde compilo a aplicação

* windows = StdCall
* linux = Cdecl

tentei inverter isso mas nao vi diferença no comportamento

Atualmente estou testando em StdCall + windows + MT (MultiThread)


Sobre o cache na dll:

Tentei localizar algum arquivo ini com as tags que vinham no cache mas não encontrei mesmo com o auxilio do pesquisador de arquivos "Everything"

A solução que encontrei foi carregar o arquivo INIsempre na inicialização.

[RESOLVIDO]

Muito Obrigado pela ajuda, se precisar de algo com node não exite em me chamar, estou aqui para ajudar tambem

Obrigado

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Consultores

Obrigado por reportar.

11 horas atrás, Renan Kemp disse:

solução que encontrei foi carregar o arquivo INIsempre na inicialização.

Perfeito, ao carregar o ini você será as configurações no componente utilizado pela lib.

11 horas atrás, Renan Kemp disse:

se precisar de algo com node não exite em me chamar, estou aqui para ajudar tambem

Parabéns pela iniciativa, esperamos sempre contar com a ajuda de todos, pois é assim que a comunidade se fortalece.

Fechando. Para novas dúvidas, criar um novo tópico.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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.