Ir para conteúdo
  • Cadastre-se

dev botao

Embutir dll no executavel trunk 2


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

Recommended Posts

Boa tarde,

Migrei meu sistema para trunk 2, estou bem feliz ta tudo rodando perfeito, porém, encontrei um problema,

Hoje tenho umas 200 empresas que rodam este sistema e a atualização dele é feita de forma online e automatica,

quando surge a dependência de uma nova dll eu gero um array de bytes do arquivo coloco numa unit (parecido com arquivo de recursos) e coloco no bloco initialization para criar a dll automaticamente.

Porém agora na trunk 2 dois estas dlls iconv, libxmlsec, libxslt, libxml2 e zlib1 fiz o mesmo processo e não funciona, de alguma maneira ele tenta carregar as dlls antes do meu bloco initialization, já entrei até no arquivo dpr do projeto e adicionei a minha unit em primeiro lugar na uses mesmo assim não funcionou ele continua dando pau por falta das dlls.

Se fosse meia dúzia de usuarios seria fácil, porém com 200 empresas e uma média de 3-4 computadores em cada uma delas, vai dar um belo trabalho atualizar tudo manualmente, hehe.

Se algum tiver alguma idéia, 

grato.

Link para o comentário
Compartilhar em outros sites

  • Fundadores

Acho que não tem como tirar as dependências dessas DLL do .EXE.. elas são injetadas pelo ACBrNFe, através da Unit "libxmlsec", que faz declaração dos métodos de forma estática

No Trunk, era possível compilar os fontes com CAPICOM ou OpenSSL... no Trunk2, não... ambos os fontes são compilados... A grande vantagem é poder mudar de SSL em RunTime (OpenSSL é ótimo para certificados A1)

Talvez você precise rever a estratégia... como por exemplo, distribuir um Instalador (Inno ??) que quando executado, copia as DLLs e atualiza o binário..

  • Curtir 2
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

  • 2 semanas depois ...

Opa, eu utilizo o seguinte, eu gero um arquivo compactado com o executável do sistema mais os arquivos que eu preciso mandar para a versão, ai no cliente, um terminal baixa a atualização e disponibiliza para os outros, aí eu embuti as dlls dentro deste arquivo compactado... porem os outros terminais copiam apenas o executável de uma pasta especifica na rede onde o primeiro que atualizou joga o executável mais novo la... então tive que acabar atualizando os terminais manualmente (copiar as dlls), porém agora estou mudando aqui e vou fazer os terminais copiarem o mesmo arquivo compactado ao invés de apenas o executável... isso resolvera o meu problema futuramente se isso acontecer de novo, mais desta vez tivemos que fazer uma força tarefa aqui e atualizar o pessoal na unha mesmo.

 

att,

Marciano Bandeira

Link para o comentário
Compartilhar em outros sites

Ola

Passei por essa situação, e fiz da seguinte maneira!

com o trunk

Ao verificar a necessidade da atualização, o sistema baixa o executável novo (sistema.exe), instala e executa.

com o trunk 2

Ao verificar a necessidade da atualização, o sistema baixa o executável (sistema.exe)(esse faz a instalação das dlls), instala e executa, que baixa o novo executável do sistema (dsistema.exe), renomeia, instala e executa.

De todos os clientes, tive problemas em cerca de 5% com essa manobra! nos quais acabei fazendo de forma manual!

Para as próximas, volto a usar da forma tradicional!

Abraços

Jair Carlos Müller

Link para o comentário
Compartilhar em outros sites

Boa tarde

vai mais uma ideia

Eu faço um Arquivo.RES adiciono todas as DLLs, no

Unit_Principal

{$R *.dfm}
{$R drive:\pastaDELPHI\subpastaDLL\ArquivoDLLs.RES}

Até mandei adicionar ao meu EXE o arquivoDLLs.RES

 

Para Desmontar o arquivo RES faço:

Initialization
Begin
  if computador<>'do meu computador' then begin
    SaveRpt;
  end;
End;

 

Procedure SaveRpt;
Var
  PathToSave, PathPasta : String;
  Res : TResourceStream;
Begin

  PathToSave := ExtractFilePath(Application.ExeName)+'\ssleay32.dll';
  Res := TResourceStream.Create(Hinstance, 'DLL1', 'ARQDLL');
  Try
    if not fileexists(pathToSave) then
      Res.SavetoFile(PathToSave);
  Finally
    Res.Free;
  End;

  PathToSave := ExtractFilePath(Application.ExeName)+'\libeay32.dll';
  Res := TResourceStream.Create(Hinstance, 'DLL2', 'ARQDLL');
  Try
    if not fileexists(pathToSave) then
      Res.SavetoFile(PathToSave);
  Finally
    Res.Free;
  End;

  PathToSave := ExtractFilePath(Application.ExeName)+'\DelZip190.dll';
  Res := TResourceStream.Create(Hinstance, 'DLL3', 'ARQDLL');
  Try
    if not fileexists(pathToSave) then
      Res.SavetoFile(PathToSave);
  Finally
    Res.Free;
  End;

End;

Bom, o EXE vai engordar um pouquinho, porém eu tb sei quem atualizou ou não, de certa forma, apos todos atualizarem,

eu faço o regime no EXE excluindo dele o .RES

Para criar o .RES 

a) Criar um .bat

BRCC32 NomedoArquivo

b.) Criar um outro arquivo do tipo texto com Extensao ".RC"

NomedoArquivo.RC

DLL1 ARQDLL drive:\pastaDELPHI\subpastaDLL\ssleay32.dll
DLL2 ARQDLL drive:\pastaDELPHI\subpastaDLL\libeay32.dll
DLL3 ARQDLL drive:\pastaDELPHI\subpastaDLL\DelZip190.dll

 

 

Se ajudar, abraços a todos

se não ajudar, foi mal ae

 

 

 

Link para o comentário
Compartilhar em outros sites

Boa tarde

vai mais uma ideia

Eu faço um Arquivo.RES adiciono todas as DLLs, no

Unit_Principal

{$R *.dfm}
{$R drive:\pastaDELPHI\subpastaDLL\ArquivoDLLs.RES}

Até mandei adicionar ao meu EXE o arquivoDLLs.RES

 

Para Desmontar o arquivo RES faço:

Initialization
Begin
  if computador<>'do meu computador' then begin
    SaveRpt;
  end;
End;

 

Procedure SaveRpt;
Var
  PathToSave, PathPasta : String;
  Res : TResourceStream;
Begin

  PathToSave := ExtractFilePath(Application.ExeName)+'\ssleay32.dll';
  Res := TResourceStream.Create(Hinstance, 'DLL1', 'ARQDLL');
  Try
    if not fileexists(pathToSave) then
      Res.SavetoFile(PathToSave);
  Finally
    Res.Free;
  End;

  PathToSave := ExtractFilePath(Application.ExeName)+'\libeay32.dll';
  Res := TResourceStream.Create(Hinstance, 'DLL2', 'ARQDLL');
  Try
    if not fileexists(pathToSave) then
      Res.SavetoFile(PathToSave);
  Finally
    Res.Free;
  End;

  PathToSave := ExtractFilePath(Application.ExeName)+'\DelZip190.dll';
  Res := TResourceStream.Create(Hinstance, 'DLL3', 'ARQDLL');
  Try
    if not fileexists(pathToSave) then
      Res.SavetoFile(PathToSave);
  Finally
    Res.Free;
  End;

End;

Bom, o EXE vai engordar um pouquinho, porém eu tb sei quem atualizou ou não, de certa forma, apos todos atualizarem,

eu faço o regime no EXE excluindo dele o .RES

Para criar o .RES 

a) Criar um .bat

BRCC32 NomedoArquivo

b.) Criar um outro arquivo do tipo texto com Extensao ".RC"

NomedoArquivo.RC

DLL1 ARQDLL drive:\pastaDELPHI\subpastaDLL\ssleay32.dll
DLL2 ARQDLL drive:\pastaDELPHI\subpastaDLL\libeay32.dll
DLL3 ARQDLL drive:\pastaDELPHI\subpastaDLL\DelZip190.dll

 

 

Se ajudar, abraços a todos

se não ajudar, foi mal ae

 

 

 

Eu faço um processo semelhante, porém ao invés de criar o res eu fiz um programinha que eu serializo o arquivo em um array de bytes e jogo direto dentro do fonte e na initalization da unit crio o arquivo, isso sempre funcionou tranquilamente... porem as dlls da openssl por algum motivo o sistema nem chega a rodar a initialization das units.

Link para o comentário
Compartilhar em outros sites

Marciano

Talvez seja porque voce já tem essas dlls, afinal elas ficam rodando em memoria e quando voce já as tem na maquina de fato ela, acredito que não sabe o que fazer.

é mais ou menos quando voce tenta substituir uma dll que está sendo usada na memoria.

Sua idéia tb é legal, se puder descrever os passos quem sabe eu possa diminuir o tamanho do EXE com a sua forma.

 

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...

Boa tarde!

Acabei de instalar o Trunk2 do ACBr e ao abrir o Delphi ocorre este problema de estar faltando a libxmlsec.dll. 

Pelos comentários entendi que deve ser atribuída ao executável do projeto, ou estou enganado...

Como posso resolver isso?

imagem em anexo.

Desde já agradeço!

2015-10-06_17h45_51.png

Att.:

Daniel

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois ...
  • Este tópico foi criado há 3256 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...