Ir para conteúdo
  • Cadastre-se

danieloliveirasouza

Consultores
  • Total de ítens

    75
  • Registro em

  • Última visita

  • Days Won

    1

Tudo que danieloliveirasouza postou

  1. Verifiquei que, e há um erro na documentação, a assinatura anterior era correta, o path do ini pode ser uma string Por favor, verifique se está usando a lib multi-thread. Por favor, anexe aqui os logs da lib do erro;
  2. Bom dia, O mesmo erro ou outro ?
  3. Não recomendo usar tipos do ref-napi com koffi. Essa combinaçao não foi testada. Estamos trabalhando em classes de alto nível para Nodejs, portanto esses demos legados serão descontinuados e substituídos. As classes de alto nível serão mais simples e transparentes de trabalhar, abstraindo essas características da lib.
  4. Bom dia, Foi a #TK-6138 para análise da contribuição!
  5. Bom dia @LeonardoRocha, Sua implementação sugere que vc está usando o mesmo handle é multiplas requisições, sugiro que vc na função getACBRReinf retorne apenas a referencia da lib. Para cada requisição deve inicializar a lib, fazer as operações e em seguida finalizar Fiz uma verificação e de fato o mapeamento desse método está errado Reinf_CriarEventoReinf: acbrreinf.func('Reinf_CriarEventoReinf', 'int', ['void *', 'string']), //correto
  6. Boa noite, Assim que fizermos o commit avisaremos! Obrigado pela contribuição @Gustavo_Schwarz
  7. Ola pessoal! Como muitos já sabem, o ffi-napi foi descontinuado e muitos projetos que usam ACBrLib com Node.js precisam migrar para uma alternativa. Alguns membros da comunidade sugeriram a biblioteca koffi Fizemos alguns testes e funcionou como esperado. Este tópico é um guia prático para quem precisa fazer essa migração. O koffi não só substitui o ffi-napi, como também elimina a necessidade do ref-napi! Instalação npm install koffi Principais diferenças Importação // Antes (ffi-napi + ref-napi) const ffi = require('ffi-napi'); const ref = require('ref-napi'); // Agora (apenas koffi) const koffi = require('koffi'); Carregando a biblioteca // Antes const lib = ffi.Library(pathDll, { /* funções */ }); // Agora const acbrcep = koffi.load(pathDll); const lib = { CEP_Inicializar: acbrcep.func('CEP_Inicializar', 'int', ['void **', 'string', 'string']), CEP_Finalizar: acbrcep.func('CEP_Finalizar', 'int', ['void *']), // outras funções... }; Trabalhando com ponteiros A inicialização de qualquer ACBrLib Multi-thread exige um parâmetro especial, o ponteiro (do tipo void **) handle. O tratamento adequado do ponteiro handle evita falhas de segmentação (AV)! Obs: os demais métodos recebem um ponteiro (void *) Importante: Na ACBrLib Multi-Thread o mapeamento deve levar em consideração o ponteiro handle. Leia mais sobre a ACBrLib Multi-Thread // Antes (handle para inicialização) let handle = ref.alloc('void *'); // Agora let handle = koffi.alloc('void *', 1); // Para usar o ponteiro nos demais métodos: // Antes: handle.deref() // Agora: koffi.decode(handle, 'void*') Inteiros por referência Alguns métodos da biblioteca exigem um buffer e uma variável do tipo inteiro (de leitura e escrita), como o exemplo CEP_UltimoRetorno. Ao executar o método, a biblioteca modificará esse inteiro. Na maioria das linguagens, um inteiro (integer) é passado por valor (cópia), mas no nosso caso é por referência! Para isso precisamos declarar esse integer especial. // Antes let tamanho = ref.alloc('int', 256); // Agora (2 passos) let tamanho = koffi.alloc('int', 1); koffi.encode(tamanho, 'int', 256); // define o valor Exemplo completo - Busca CEP Código com koffi: const koffi = require('koffi'); const path = require('path'); const TAMANHO_BUFFER = 1024; const pathDllACBrLibCEP = path.join(__dirname, 'ACBrCEP64.dll'); const acbrcep = koffi.load(pathDllACBrLibCEP); const lib = { CEP_Inicializar: acbrcep.func('CEP_Inicializar', 'int', ['void **', 'string', 'string']), CEP_Finalizar: acbrcep.func('CEP_Finalizar', 'int', ['void *']), CEP_BuscarPorCEP: acbrcep.func('CEP_BuscarPorCEP', 'int', ['void *', 'string', 'char *', 'int *']), CEP_ConfigGravar: acbrcep.func('CEP_ConfigGravar', 'int', ['void *', 'string']), CEP_ConfigGravarValor: acbrcep.func('CEP_ConfigGravarValor', 'int', ['void *', 'string', 'string', 'string']) }; // Inicialização let handle = koffi.alloc('void *', 1); let eArqConfig = path.resolve(__dirname, 'ACBrLib.ini'); let eChaveCrypt = ''; // Buffers let aloc_sResposta = Buffer.alloc(TAMANHO_BUFFER); let aloc_esTamanho = koffi.alloc('int', 1); koffi.encode(aloc_esTamanho, 'int', TAMANHO_BUFFER); // Execução lib.CEP_Inicializar(handle, eArqConfig, eChaveCrypt); // Configurações (opcional) lib.CEP_ConfigGravarValor(koffi.decode(handle, 'void *'), 'CEP', 'WebService', '3'); // salvar configurações lib.CEP_ConfigGravar(koffi.decode(handle, 'void *'), eArqConfig); // Busca o CEP lib.CEP_BuscarPorCEP(koffi.decode(handle, 'void *'), '18270-170', aloc_sResposta, aloc_esTamanho); console.log('Resultado:', aloc_sResposta.toString()); // Finaliza lib.CEP_Finalizar(koffi.decode(handle, 'void *')); Links úteis Documentação oficial do koffi Mapeamento de funções Trabalhando com ponteiros Conclusão A migração do ffi-napi para koffi é direta e o código resultante utiliza apenas uma dependência. O exemplo acima demonstra o uso com ACBrLib CEP, mas a abordagem é aplicável a outras bibliotecas ACBr (NFe, SAT, etc.). Testado com: ACBrLib CEP, mas deve funcionar com todas as outras libs (NFe, SAT, etc.) _Espero que ajude! Se encontrarem algum problema ou tiverem sugestões, postem aqui. _
      • 7
      • Curtir
  8. Boa tarde, Obrigado pela contribuição, fizemos o commit r36979
  9. @Clayton Alves Verifiquei com o suporte, e eles sugeriram anexar como zip, Por favor , tente anexar o aquivo como zip
  10. Boa tarde, Mais uma vez agradecemos sua contribuição, e criamos a #TK-6471 para essa análise.
  11. Boa tarde, Agradeçemos sua contribuição, iremos analisar. Quanto este erro, vou verificar com time de suporte.
×
×
  • 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.

The popup will be closed in 10 segundos...