Ir para conteúdo
  • Cadastre-se

Programa crashando ao usar lib ConsultaCNPJ e NFe


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

Recommended Posts

Postado

Percebi que no linux, meu programa em C++ crasha quando tenho instanciado as duas libs ACBR ConsultaCNPJ e NFE e uso um método qualquer da lib CNPJ, como o Versão(). o Crash só acontece no Linux quando eu instacio a classe das duas libs e uso o método da lib consulta, quando eu uso apenas um método da lib NFE não crasha. Alguma ideia do por que isto pode estar acontecendo? 

  • Consultores
Postado

 

Certifique-se que seu código e lib sejam respectivamente MT ou ST,

Lembre-se que MT tem um ponteiro handle ..

Além disso, cada lib deve ter seu ponteiro handle independente ...

 


int main (int argc,char **) {
	void * libHandleNFe;
	void * libHandleCNPJ;

  	libHandleNFe = NULL;
  	libHandleCNPJ = NULL;
	NFE_Inicializar(&libHandleNFe,"[Memory]","");
	CNPJ_Inicializar(&libHandleCNPJ,"[Memory]","");
	NFE_Finalizar(libHandleNFe);
  	CNPJ_Finalizar(libHandleCNPJ);
  	
  
  	// descarte as referencias, após finalizar o uso 
  	libHandleNFe = NULL;
  	libHandleCNPJ = NULL;
  	return 0;
}
  

 

Postado
1 hora atrás, danieloliveira-mm disse:

 

Certifique-se que seu código e lib sejam respectivamente MT ou ST,

Lembre-se que MT tem um ponteiro handle ..

Além disso, cada lib deve ter seu ponteiro handle independente ...

 


int main (int argc,char **) {
	void * libHandleNFe;
	void * libHandleCNPJ;

  	libHandleNFe = NULL;
  	libHandleCNPJ = NULL;
	NFE_Inicializar(&libHandleNFe,"[Memory]","");
	CNPJ_Inicializar(&libHandleCNPJ,"[Memory]","");
	NFE_Finalizar(libHandleNFe);
  	CNPJ_Finalizar(libHandleCNPJ);
  	
  
  	// descarte as referencias, após finalizar o uso 
  	libHandleNFe = NULL;
  	libHandleCNPJ = NULL;
  	return 0;
}
  

 

As duas libs que estou usando são MT, percebi aqui que só de instanciar as duas ja crasha, estou tentando usar as libs com QT framework e esse código faz crashar o programa, ao tentar escrever alguma coisa no LineEdit(widget TextField do qt):
 

    ACBrNFe *nfe = new ACBrNFe("nfe.ini", "");
    std::string a = nfe->Versao();
    nfe = NULL;
    ACBrConsultaCNPJ *cnpj = new ACBrConsultaCNPJ("cnpj.ini", "");

 

Postado

Sim os handles são definidos na classe, para NFE estou usando as classes do demo, para o consulta CNPJ criei a classe wrapper baseada na NFE. as duas classes funcionam separadamente.

Código da classe wrapper CNPJ apenas até a função versao:

typedef int (*CNPJ_Inicializar)(void**, const char*, const char*);
typedef int (*CNPJ_Finalizar)(void*);
typedef int (*CNPJ_Versao)(void*, char*, long*);


ACBrConsultaCNPJ::ACBrConsultaCNPJ(std::string eArqConfig, std::string eChaveCrypt) {
#if defined(ISWINDOWS)
#if defined(ENVIRONMENT32)
    nHandler = LoadLibraryW(L"ACBrConsultaCNPJ32.dll");
#else
    nHandler = LoadLibraryW(L"ACBrConsultaCNPJ64.dll");
#endif
#else
#if defined(ENVIRONMENT32)
    std::string path = "/usr/lib/libacbrlibconsultacnpj32.so";
#else
    std::string path = "/usr/lib/libacbrconsultacnpj64.so";
#endif
    nHandler = dlopen(path.c_str(), RTLD_LAZY);
#endif

    if (!nHandler)
        throw std::runtime_error("Falha ao carregar biblioteca ACBrLibConsultaCNPJ");

    CNPJ_Inicializar method;
#if defined(ISWINDOWS)
    method = reinterpret_cast<CNPJ_Inicializar>(GetProcAddress(nHandler, "CNPJ_Inicializar"));
#else
    method = reinterpret_cast<CNPJ_Inicializar>(dlsym(nHandler, "CNPJ_Inicializar"));
#endif

    if (!method)
        throw std::runtime_error("Não encontrou função CNPJ_Inicializar na biblioteca");

    const int ret = method(&this->libHandler, eArqConfig.c_str(), eChaveCrypt.c_str());
    CheckResult(ret);
}

ACBrConsultaCNPJ::~ACBrConsultaCNPJ() {
    qDebug() << "~ACBrConsultaCNPJ() chamado";
    if (!nHandler) return;

    CNPJ_Finalizar method;
#if defined(ISWINDOWS)
    method = reinterpret_cast<CNPJ_Finalizar>(GetProcAddress(nHandler, "CNPJ_Finalizar"));
#else
    method = reinterpret_cast<CNPJ_Finalizar>(dlsym(nHandler, "CNPJ_Finalizar"));
#endif
    if (method)
        method(this->libHandler);

#if defined(ISWINDOWS)
    FreeLibrary(nHandler);
#else
    dlclose(nHandler);
#endif
        qDebug() << "Finalização concluída";
}


std::string ACBrConsultaCNPJ::Versao() const {
    CNPJ_Versao method;
#if defined(ISWINDOWS)
    method = reinterpret_cast<CNPJ_Versao>(GetProcAddress(nHandler, "CNPJ_Versao"));
#else
    method = reinterpret_cast<CNPJ_Versao>(dlsym(nHandler, "CNPJ_Versao"));
#endif

 

Postado
18 horas atrás, danieloliveira-mm disse:

Essa abordagem é muito complexa, eu não recomendo ...

use para mapear as funções ...

extern "C" {
  extern int CNPJ_Inicializar(void ** libHandle, const char * eArqConfig, const char * chaveCrypt);
}

 

Não funcionou, não consigo entender como uma lib interfere na outra sendo que as duas são compiladas separadamente e os pacotes comuns são estaticamente compilado em cada lib. Já tentei usar a ACBrconsultaCNPJ ST junto da NFE MT mas o problema continua. 

Postado

Meu código esta usando as duas libs MT 64 bit com esse codigo simples, o programa da seg fault após exibir a versão. Se eu comentar o construtor de qualquer uma lib a outra funciona sem seg fault. Alguém aqui está usando essas duas libs juntas com c++ no linux?

#include "ACBrNFe.h"
#include "ACBrConsultaCNPJ.h"
#include <iostream>

int main(){
  ACBrConsultaCNPJ cnpj("cnpj.ini", "");
  ACBrNFe nfe("nfe.ini", "");
  std::cout << cnpj.Versao() << "\n";
}

 

 

Postado (editado)
Em 15/11/2025 at 12:17, danieloliveira-mm disse:

Bom dia, preciso ver como implementou a  funcao versao ?

Nesse código o método Versao() está assim:
 

std::string ACBrConsultaCNPJ::Versao() const {
    CNPJ_Versao method;
#if defined(ISWINDOWS)
    method = reinterpret_cast<CNPJ_Versao>(GetProcAddress(nHandler, "CNPJ_Versao"));
#else
    method = reinterpret_cast<CNPJ_Versao>(dlsym(nHandler, "CNPJ_Versao"));
#endif

    std::string buffer(BUFFER_LEN, '\0');
    long len = BUFFER_LEN;

    const int ret = method(this->libHandler, buffer.data(), &len);
    CheckResult(ret);
    return ProcessResult(buffer, len);
}


Mas ja testei com mais ou menos igual você recomendou:
 

void ACBrConsultaCNPJ::resolveSymbols()
{
    CNPJ_InicializarMT = (CNPJ_InicializarPtr)DLSYM(dllHandle, "CNPJ_Inicializar");
    CNPJ_FinalizarMT   = (CNPJ_FinalizarPtr)  DLSYM(dllHandle, "CNPJ_Finalizar");
    CNPJ_VersaoMT      = (CNPJ_VersaoPtr)     DLSYM(dllHandle, "CNPJ_Versao");
}

void ACBrConsultaCNPJ::load(const std::string &libPath,
                            const std::string &iniPath,
                            const std::string &cryptKey)
{
    unload();

    dllHandle = DLOPEN(libPath.c_str());
    if (!dllHandle)
    {
        throw std::runtime_error(std::string("Falha ao carregar ")
                                 + libPath + ": " + dlerror());
    }

    resolveSymbols();

    int ret = CNPJ_InicializarMT(&cnpjHandle,
                                 iniPath.c_str(),
                                 cryptKey.c_str());

}

std::string ACBrConsultaCNPJ::versao()
{
    if (!cnpjHandle)
        throw std::runtime_error("ACBrConsultaCNPJ não inicializado.");

    int bufferSize = 256;
    std::vector<char> buffer(bufferSize);

    int ret = CNPJ_VersaoMT(cnpjHandle, buffer.data(), &bufferSize);

    if (ret != 0)
        throw std::runtime_error("Erro ao chamar CNPJ_Versao: " + std::to_string(ret));

    return std::string(buffer.data());
}

 

Editado por Rafael Chuede
Postado

Compilei somente a lib consultacnpj usando gtk3 ao inves de qt6 e nao tenho mais o crash... mas preciso que as duas libs sejam compiladas com qt6 o que posso fazer? nem sei por que a lib consultacnpj precisa de qt ou gtk mas enfim

  • Este tópico foi criado há 203 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.