Jump to content
Fórum Script Brasil
  • 0

Atualizar Dll


Geovani
 Share

Question

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 to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.7k
×
×
  • Create New...