Quantos de nós já não vimos uma mensagem assim "Este programa
executou uma operação ilegal e será fechado" ou então "Este
programa causou um erro na NomeEstranho.DLL e será fechado".
Praticamento todo o usuários do Windows, principalmente da galera do 9x (95,
98 e 98 SE) em diante, já experimentou algum problema deste tipo.
Não é sempre que ele ocorre, mas estimo eu que 95%
dos casos você pode estar vivendo um problema que ficou mais conhecido como
"DLL Hell ou "Inferno das DLLs". Esse problema
ocorre principalmente quando programas diferentes utilizam versões ímpares de
uma mesma DLL (Dynamic Link Library ou Link de Biblioteca Dinâmica), ou quando
uma DLL do sistema operacional é sobre escrita por outra de mesmo nome pertencente a algum programa que
você instalou.
Nesta minha dica, vou mostrar e entender o que são e como funcionam esses
arquivos. Vamos investigar, o porquê de tantos problemas e, finalmente, analisar
algumas possíveis soluções implementadas pelo próprio Windows, como uma forma
de minimizar as conseqüências deste tipo de inconvenientes.
O Surgimento dos Arquivos
.DLL
Nos primórdios da era da informática um programa era constituído apenas por
um arquivo executável que continha todas as instruções necessárias para o
seu funcionamento. Entretanto, alguns programas complexos poderiam conter
diversos executáveis. Com o passar do anos, o tamanho dos programas cresceu consideravelmente
principalmente com a adoção generalizada das interfaces gráficas
(GUI -Graphical User Interface ou Interface Gráfica de Usuário), o que fez com
que apenas a divisão dos programas em vários arquivos executáveis se tornasse
ineficiente sob o ponto de vista produtivo, uma vez que o código deles não
podia ser compartilhado.
Para resolver este problema os projetistas do Windows começaram a tirar vantagem
de uma estratégia de geração de códigos chamada "Linkagem" dinâmica. Como sabemos grande parte das funções
utilizadas em um programas não é codificada em seu corpo, a maioria delas tem seu código armazenado em
bibliotecas. Bom, em uma "linkagem" convencional o que ocorre
basicamente é que o programador informa ao compilador a localização das
bibliotecas, este importa os códigos das funções e o concatena com o código
do programa gerando assim, um arquivo executável contendo o código escrito
pelo programador e o código oriundo das bibliotecas.
Em uma "linkagem" dinâmica, o código das funções não é
armazenado no arquivo executável, mas consultado durante a execução do
programa, em uma biblioteca pré-compilada. Existem diversas vantagens nesse
tipo de estratégia, dentre elas posso citar:
- Possibilidade de criação de arquivos executáveis menores;
- Bibliotecas dinâmicas permitem que o código seja
compartilhado por vários arquivos executáveis, evitando assim que um mesmo
trecho de código se repita em diferentes programas;
- Atualizações nos programas são mais fáceis, uma vez
que é possível alterar apenas bibliotecas dinâmicas ao invés de reinstalar todo o programa.
As DLLs são as bibliotecas dinâmicas padrão de todos os sistemas da família
Windows. Sendo que que a famosa API (Application Program Interface ou Aplicação
de Programa de Interface) do Windows, é, em sua grande maioria, baseada neste
tipo de arquivo. É na API que estão predefinidas as informações de como
devem ser desenhadas, por exemplo, barras de rolagem, botões e caixas de diálogos,
fazendo com que os programadores tenham menos trabalho para desenvolverem aplicações
e promovendo a padronização das interfaces dos programas. Um bom exemplo é a comdlg32.dll
(Commom Dialog Library ou Biblioteca de Diálogo Comum), que contém alguns diálogos
padrão, como o de seção de cores e abertura de arquivos.
Da mesma forma que um programa como o MS_Office possui diversas versões
(97,2000 e XP), as DLLs que acompanham o Windows também podem ter. Sendo assim,
podem existir, por exemplo sistemas WinMe que são acompanhados de versões
distintas da mesma DLL.
O problema é que um programa compilado e testado deixa de funcionar corretamente
com uma versão mais nova ou mais antiga da biblioteca. Isso está relacionado
ao fato de que uma versão mais antiga pode não possuir todas as
funcionalidades exigidas pelo software e uma versão mais nova pode não ser
totalmente compatível com as versões anteriores.
Além disso, um programa construído para funcionar com uma DLL em determinado
idioma (Português, Inglês e etc...) pode não funcionar com uma DLL de idioma
diferente.
Para visualizarmos informações de versão com o Windows
Explorer basta clicarmos com o botão direito sobre o arquivo, selecionar a opção Propriedades e,
em seguida, clicar sobre a aba Versão.
Bom, mas como resolver este tipo de problema?
O fato é que não existe nenhuma receita mágica para isso, contudo, a partir
do Windows 98, a Microsoft começou a se preocupar com este tipo de problema,
tanto que este vem acompanhado de um programa gerenciador de conflitos de versão
(vcmui.exe) - Version Conflict Manager ou Corretor de Conflitos de Versão.
Este programinha fica armazenado na pasta c:\windows
e mantém uma cópia dos arquivos de sistema (DLL, OCX, SYS,...) que foram substituídos
durante as atualizações do Windows. As cópias de segurança
ficam armazenadas na pasta c:\windows\vmc e no
caso de algum conflito que foram substituídos podem ser restaurados com a
ajuda da ferramenta.
Outra ferramenta presente no Windows 98/2000/XP é o sfc.exe (System File
Checker ou Sistema de Checagem de Arquivos), que tem como objetivo proteger
arquivos vitais do sistema contra substituições ou exclusões. Ao contrário
do vcmui.exe o SFC procura restaurar os arquivos danificados ou
substituídos, a partir da mídia original.
Para executarmos o SFC, no Windows 2000, basta digitarmos c:\>sfc
/scannow na linha de comando, pressionar Enter
e, então, a aplicação solicitará o CD de instalação do sistema para que os
arquivos possam ser restaurados. Também é possível realizar checagens automáticas,
através de algumas opções do programa. Tais opções podem ser visualizadas
digitando-se SFC, seguido da tecla Enter.
O Windows ME também possui um mecanismo para a verificação de integridade dos
arquivos de sistema. Esta ferramenta pode ser acionada através de um utilitário
também presente no Windows 98, chamado msinfo32.exe. Para executá-lo,
selecione a opção Executar do Menu
Iniciar, logo em seguida digite msinfo32.exe e pressione o botão
OK. Após a abertura do programa, vá até o
menu Ferramentas de verificação de assinatura
e uma tela será exibida. Com o verificador de assinatura, é possível
descobrir quais os arquivos do sistema foram substituídos, o que pode ser muito
útil durante a solução de conflitos de versão.
Como uma medida mais automatizada, o Windows ME oferece também a possibilidade
de restaurar o sistema a um estado anterior (sem problemas), através de um
utilitário que pode ser encontrado no Menu Iniciar,
em: Programas ->Acessórios
-> Feramentas -> Restauração
do Sistema. Este aplicativo possui pontos de verificação gerados
automaticamente quando certos programas são instalados, tornando possível
reverter as ações feitas pelos programas de instalação.
Também é possível criar um ponto de checagem manualmente a qualquer hora,
permitindo que o usuário crie um deles, por exemplo, antes de instalar algum
programa e, caso haja algum problema, tente reverter a situação através do
restaurador. Além das ferramentas nativas do próprio Windows, é possível
encontrar programas produzidos por outros fabricantes que se propõem a, se não
solucionar, pelo menos diminuir as dores de cabeça provocadas por estes tipos
de problemas, tal como o Version Stamper (http://www.desaware.com/VersionStamperL2.html).
Entretanto, podem existir casos principalmente na família do Windows 9x, onde
infelizmente a reinstalação do Sistema Operacional pode ser a única solução.
Espero ter contribuído para o esclarecimento da função desempenhada pelos
arquivos .DLL do Windows, bem como ter apresentado procedimentos para se tratar
eventuais problemas relacionados a eles.
Se você está interessando em mais
informações sobre o assunto, ou deseja conversar sobre ele, basta dar um pulo
no Fórum do BoaDica (http://www.forumboadica.com.br).