Ir para conteúdo
  • Cadastre-se

dev botao

Problemas Com Propriedade Pathdll


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

Recommended Posts

Boa tarde senhores.

 

Estou precisando trabalhar na minha empresa com duas versões da Bemafi32.dll da Bematech, por ter encontrado problemas ao usar a dll versão 7 com IFs do convênio anterior ao 09/09.

Para tal, criei uma subpasta para armazenar a Bemafi32.dll versão 7 (convênio 09/09).

 

Após criar o componente AcbrECF, atribuo o valor dessa subpasta à propriedade "AcbrECF.ECF.PathDLL".

  ECF := TACBrECF.Create(Application); 
  ECF.Modelo := ecfEscECF;
  ECF.ECF.PathDLL := ExtractFilePath(Application.ExeName)+'bematech09\';

Se eu verificar o valor da propriedade antes de chamar qualquer função, está lá o valor que atribuí, porém, na classe da bematech (ACBrECFBematech) onde dá a carga nas funções da dll,

o valor de "PathDLL" está zerado, então não é considerado o valor por mim atribuído:

 

 procedure BematechFunctionDetect( FuncName: String; var LibPointer: Pointer;
    LibName : String = cLIB_Bema ) ;
 var
   sLibName: string;
 begin
   if not Assigned( LibPointer )  then
   begin
     // Verifica se exite o caminho das DLLs
     if Length(PathDLL) > 0 then
        sLibName := PathWithDelim(PathDLL);

Tentei verificar no código mas não encontrei nada de estranho.

Alguém tem alguma ideia do que pode estar acontecendo? Estou atribuindo o valor para a propriedade errada? Ou a classe da bematech estaria olhando para a propriedade errada?

 

 

Agradeço desde já!

Editado por cantelli.r
  • Curtir 1

Rodrigo Cantelli

Link para o comentário
Compartilhar em outros sites

Fazendo mais alguns testes, entendi melhor o problema.

Como estou usando o protocolo EscECF, ele cria a classe da bematech (neste caso) ao necessitar de alguma função de sua dll, através da função CriarECFClassPorMarca.

 

O que fiz por enquanto para resolver meu problema, foi atlerar justamente a função CriarECFClassPorMarca, adicionando a última linha:

function TACBrECFEscECF.CriarECFClassPorMarca: TACBrECFClass;
begin
  Result := nil;
  if IsBematech then
    Result := TACBrECFBematech.create(fpOwner)
  else if IsEpson then
    Result := TACBrECFEpson.create(fpOwner);

  Result.PathDLL := Self.PathDLL;
end;

Porém, não sei se seria a melhor forma de ser feito. Fiquei na dúvida se essa propriedade deveria ser herdada automaticamente ou não...

 

Desta forma está funcionando, mas caso alguém tiver uma solução que considere mais correta para este caso por favor me informe.

 

Obrigado!

Editado por cantelli.r

Rodrigo Cantelli

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Sua solução parece a correta... Aplicarei no SVN...

 

A passagem das propriedades para o ACBrECFClass geralmente ocorre no método:  "TACBrECF.SetModelo"...

como nesse caso ele não é chamado, a classe nasce com as propriedades default.

 

(talvez seja necessário fazer o mesmo com outras propriedades, se necessário)

 

Obrigado pela analise... ;)

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

Eu que agradeço pelo retorno, Daniel!

Como comentei, dessa forma está passando corretamente o PathDLL, porém, por algum motivo, o componente ainda está buscando a dll no diretório do exe.

Quando na unit "ACBrECFBematech", é chamada a função "LoadDLLFunctions", na função "Bematech_FI_VersaoDll", está retornando a versão da dll que está na pasta do exe.

 

Tentei descobrir o porque, e não consegui, aparentemente estaria tudo certo... a variável "sLibName" está correta, mas está carregando a dll errada.

 

Agora realmente fiquei sem saber o que está acontecendo.

 

Se alguém puder me ajudar, agradeço!

Rodrigo Cantelli

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Pode ser uma limitação da própria DLL..

No geral... é muito melhor manter todas as DLLs  na mesma pasta do seu .EXE

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

  • 5 meses depois ...
  • Membros Pro

Olá pessoal,

 

tive o mesmo problema ao carregar a DLL. Nossa aplicação em dodos os arquivos relacionados no PAF-ECF no mesmo diretório do EXE. Desa forma achei mais conveniente alterar a função GetPathDLL para:

 

function TACBrECFClass.GetPathDLL : string ;
begin
  if Trim(fsPathDLL) = '' then
  fsPathDLL := ExtractFilePath(ParamStr(0));
  //
  Result := PathWithDelim(fsPathDLL);
end;
Link para o comentário
Compartilhar em outros sites

  • Fundadores

Dessa maneira o retorno de "PathDLL" nunca será vazio... e nesse caso, forçará a aplicação a distribuir a DLL no mesmo diretório do .EXE...

 

Alguns programadores preferem usar o c:\windows\system32 ou c:\windows\syswow64 para distribuir as DLLs dos fabricantes...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

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

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3319 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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...