Quando devo registrar uma DLL?

Categoria: Artigos
Categoria Pai: Addicted 2 Delphi!
Acessos: 8958
Imagem meramente ilustrativa

Para quem não sabe, DLL significa Dynamic Link Library ou Biblioteca de Vínculo Dinâmico. Como o nome sugere, uma DLL é ligada (ou vinculada) a algo dinamicamente. Esse "algo" seria um programa executável (ou outra DLL) e "dinamicamente" refere-se ao fato de que o programa executável utiliza código contido na DLL, que é um módulo separado, de forma dinâmica, sob demanda, pois tal código não foi compilado juntamente com o código do executável. Por falar em módulo separado, costuma-se chamar tanto programas executáveis quanto DLLs simplesmente de módulos porque tecnicamente, uma DLL também é um executável, mas suas características exclusivas fazem com que este "executável" não execute sem um "programa host", o qual tem a função de carregar a DLL no seu espaço de memória, tornando ambos (EXE e DLL) uma coisa só!

Depois dessa encheção de linguiça inicial eu vou fazer aqui uma revelação. Sei que vai doer em muitos de vocês, mas a verdade tem que ser dita:

Não! Nem toda DLL precisa ser registrada, aliás, a grande maioria delas não precisa disso!

Quando você obtém uma DLL qualquer para usar, não há meios diretos de saber se esta DLL precisa ser registrada ou não, por isso, o primeiro passo é usar um pouco de lógica para supor seu uso. Primeiramente, ao obter uma DLL você o faz porque ela contém algo que você precisa, logo, você de algum modo sabe o que ela tem, logo, deveria saber se ela é uma DLL registrável ou não. Normalmente aquele que desenvolveu a DLL sabe exatamente o que ela é, portanto, se você obtiver uma DLL diretamente do fornecedor que a desenvolveu, este, com toda certeza, vai informar se esta DLL precisa ser registrada antes de ser usada de alguma forma. Normalmente, quando nada é especificado, a DLL NÃO PRECISA ser registrada e simplesmente exporta funções para uso direto.

DLLs registráveis são todas aquelas que expõem/contém servidores COM, Objetos Active X, Objetos OLE e outras destas tecnologias exóticas que a Microsoft criou e que provavelmente você, que tenta registrar uma DLL qualquer sem saber se isso é necessário, provavelmente não vai usar. Em outras palavras, uma DLL só precisa ser registrada se você tiver certeza disso, do contrário ela não é registrável. Fica a dica.

O DLL Export Viewer

Se mesmo assim você é destes que gosta de seguir receitas de bolo e não quer errar jamais, eu vou dar a dica definitiva pra você não se passar por noob retardado nos fóruns/grupos/listas dos quais participa, ao questionar sobre registro de DLLs. Baixe o programa DLL Export View (Freeware), que está disponível em http://www.nirsoft.net/utils/dll_export_viewer.html. Este programa simplesmente mostra todas as funções que uma DLL exporta. Como exemplo, eu usei a clássica capicom.dll, a qual é registrável. Veja abaixo a saída do programa:

Note que existem duas funções especiais, DllRegisterServer e DllUnregisterServer. Estas funções são as responsáveis por "interagir" com o programa RegSvr32, o qual promoverá o registro (ou desregistro) da DLL, portanto, se sua DLL tem estas duas funções, é certeza que ela precisa ser registrada, a não ser que algum troll zoeiro tenha criado funções com estes nomes propositalmente para enganar a todos, mas estou descartando esta hipótese.

Só como forma de aparar todas as arestas, para não deixar nenhuma dúvida, segue o screenshot da saída do DLL Export Viewer para uma DLL "comum":

Note que não existem as duas funções especiais de registro, logo, esta DLL não é registrável. Use-a de forma tradicional.

O DLL Export Viewer é uma mão na roda para inspecionar as funções exportadas por uma DLL. Isso é útil para qualquer bisbilhoteiro escovador de bits interessado em expandir seus conhecimentos. Use o programa para inspecionar funções exportadas por algumas DLLs do Windows, como User32.dll ou Kernel32.dll. Garanto que você verá algumas funções de nomes familiares usadas no Delphi e isso não é coincidência. Muitas das funções usadas no Delphi são funções de API do Windows ou wrappers para funções de API. Por exemplo, Application.MessageBox é uma função wrapper para as funções MessageBoxA ou MessageBoxW, dependendo de qual tipo de String se usa, "A" para AnsiStrings ou "W" para WideStrings. Estas funções encontram-se em User32.dll, como se pode ver no screenshot abaixo:

Note que existem outras versões desta mesma função e garanto que muitos de vocês leitores jamais as viram, portanto, mãos à obra e Google nelas! Falando em Google, não vou ensinar como usar o DLL Export Viewer, use sua inteligência e descubra (ou leia o manual em Inglês que vem junto do seu executável, dentro do zip).

Eu espero, depois deste artigo, não mais ver dúvidas de pessoas nos locais onde eu ando (Fóruns, Grupos de Facebook, Listas de Discussão, Rua, etc.) a respeito de tal função não estar funcionando porque a DLL não foi registrada. Juro que vou responder jogando o link deste artigo. De nada!