Ir para conteúdo
Fórum Script Brasil
  • 0

Atualizar Dll


Geovani

Pergunta

Olá Pessoal!

Trabalho no suporte de um empresa que desenvolve sistemas em Delphi 5.

Quando preciso fazer atualização de DLL, preciso substituir a DLL atual pela DLL a ser atualizada, se algum usuário estiver usando a DLL não será possível substituir, neste caso, eu renomeio a DLL.

Em alguns servidores não é possível renomear. Os Servidores dos clientes São o Windows 2000 server.

alguém sabe me dizer se há uma configuração do servidor ou no momento de gerar a dll no delphi para poder renomear arquivos que estão abertos?

abraço

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0
Guest --Jonas --

Quando é preciso fazer atualização de DLL o problema de não conseguir removê-la , ou renomea-la ocorre porque existem “handles” de outros processos para esta DLL.

Para excluí-la é necessário primeiramente “matar” o processo que tem o “handle” aberto com a DLL.

Sei que existem APIs do windows que conseguem fazer isto, so não me lembro qual...

por exemplo : Esta função copia ou move arquivos usando a API do Windows

function ProcessArquivo(const Origem, Destino : string; Operacao, Modo:Integer) : Boolean;
  // Requer a unit ShellApi na clausula uses da unit
  Const
  Aborted : Boolean = False;
  var
      shfo : TSHFileOpStruct;
  begin
     FillChar(shfo,SizeOf(shfo),$0);
     with shfo do
     begin
        if Operacao > 2 then
           begin
              operacao := 2;
           end;
        if Modo > 5 then
           begin
              modo := 1;
           end;
        case operacao of
          1: wFunc := FO_MOVE;
          2: wFunc := FO_COPY;
        end;
       pFrom := Pchar(Origem);
       pTo := Pchar(Destino);
       case Modo of
          1: fFlags := FOF_SILENT;
          2: fFlags := FOF_ALLOWUNDO or FOF_FILESONLY;
          3: fFlags := FOF_RENAMEONCOLLISION;
          4: fFlags := FOF_NOCONFIRMATION;
          5: fFlags := FOF_SIMPLEPROGRESS;
       end;
  end;
  Result := (SHFileOperation(shfo)= 0) and (not Aborted);
  end;

Link para o comentário
Compartilhar em outros sites

  • 0

Opa

Fera isto realmente é muitooo complicado já passei por isso...

A única maneira de substituir estes arquivos que estão em uso é na inicialização

do windows, o windows oferece suporte a isto...

No Windows 98 o problema é maior, porque o nome dos arquivos não pode estourar

8.3, ou seja, como eles são substituidos ainda em modo DOS, o DOS suporta some

nomeação 8.3 ou seja, 8 caracteres para o nome do arquivo, e 3 para a extensão

senão da problema....

Quando no Windows 98 você ve aquela mensagem antes de entrar no Windows...

"Aguarde enquanto alguns programas são atualizados..."

"Os programas foram atualizados com exito..."

Quer dizer que algum programa utilizou este mecanismo...

Exemplo

scriptbr.exe = No nome 8 caracteres e na extensão 3 (OK)

scriptbrasil.exe = No nome 12 caracteres já daria problema, na extensão 3 está ok mas FALHA,

porque o nome estoura os 8 caracteres, vai ficar como scriptbr~1.exe

Já no Windows NT/2000/XP/Vista não tem este problema...

Você vai ter que testar bastante, mas o uso deste mecanismo do Windows que comentei

para substituir na inicialização do sistema se usa assim

uses Windows, SysUtils;

If Win32Platform = VER_PLATFORM_WIN32_NT Then

MoveFileEx( Pchar(X),

Pchar(Y),

MOVEFILE_REPLACE_EXISTING or MOVEFILE_DELAY_UNTIL_REBOOT)

Else

WritePrivateProfileString(

'rename',

Pchar(Y),

Pchar(X),

'wininit.ini' );

X = Caminho de origem do arquivo

Y = Caminho de destino

Ou seja, se você tem uma DLL chamada abc.dll na pasta do Windows e você quer

susbstituí-la, primeiro você vai ter que armazenar a DLL mais nova em uma pasta

temporária de preferencia coloque na raiz do HD, C:\ por exemplo, porque como

expliquei o DOS só suporta 8.3 pra não ficar os nomes cheio de ~

então em X você colocaria 'C:\abc.dll' e em Y 'C:\WINDOWS\abc.dll' lembrando que

o nome de origem não precisa ser exatamente o mesmo do arquivo original...

Entendeu mais ou menos? rs

Detalhe, os arquivos só são substituidos na inicialização do sistema como mencionei...

abraçox

Link para o comentário
Compartilhar em outros sites

  • 0

Jonas:

O Codigo que você me passou não deu!

Churc:

Entendi

Mas eu acho que não expliquei direito... Vamos lá... o sistema da empresa é baseado em cliente/servidor, as telas do sistema são criadas em DLL´s e tem um executável contendo menus, cada menu chama uma dll.

Não é instalado nada nas estações, apenas é criado um atalho para o executável.

O que eu não entendo é que em determinados clientes para atualizar uma Dll e renomeio, assim, os que estão com a tela aberta estao com a dll antiga, os proximos que abrirem a tela, visualizaram a dll atualizada.

E em outros clientes não é possivel renomear, diz que o arquivo está sendo usado, ai eu tenho que agendar um horario para todos sairem do sistema e eu atualizar.

Link para o comentário
Compartilhar em outros sites

  • 0
Guest --Jonas --
Jonas:

O Codigo que você me passou não deu!

Churc:

Entendi

Mas eu acho que não expliquei direito... Vamos lá... o sistema da empresa é baseado em cliente/servidor, as telas do sistema são criadas em DLL´s e tem um executável contendo menus, cada menu chama uma dll.

Não é instalado nada nas estações, apenas é criado um atalho para o executável.

O que eu não entendo é que em determinados clientes para atualizar uma Dll e renomeio, assim, os que estão com a tela aberta estao com a dll antiga, os proximos que abrirem a tela, visualizaram a dll atualizada.

E em outros clientes não é possivel renomear, diz que o arquivo está sendo usado, ai eu tenho que agendar um horario para todos sairem do sistema e eu atualizar.

o que te passei foi so um exemplo de uso de APIs do windows

Geovani ... já passei por isso, então tive que bolar 2 situações: a primeira de bloquear pelo servidor todos os usuarios do sistema ate que a atualização fosse completada .... a segunda de agendar um horario no servidor para fazer uma atualização automatica .... funcionou legal.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...