De que se trata o artigo

A coleção madShi é uma espécie de canivete suíço para Delphi cujas funções vão desde manipulação de strings à segurança. Ela pode rapidamente suprir uma série de necessidades básicas dos programadores sem tirar o foco do negócio.


Para que serve

O objetivo principal da coleção madShi é suprir algumas "ausências" da API do Windows ou na VCL/RTL. Ela pode ser útil na automatização de tarefas e para explorar recursos pouco conhecidos ou pouco documentados do Windows.


Em que situação o tema é útil

A coleção madShi pode ajudar uma empresa a tirar um pouco o foco do mundo "software" e focar mais no negócio. Isso porque a coleção terceiriza certos serviços, como compressão, criptografia e segurança transformando-os apenas em chamadas a funções estáticas.

Biblioteca madShi

Muitos programadores baixam ou criam bibliotecas de uso geral e de fácil chamada para procurar ou formatar strings, encontrar um diretório compartilhado, criptografar uma senha entre outras funcionalidades. Algumas dessas funcionalidades podem ser supridas pela VCL e pela RTL, outras podem ser vistas na JCL do projeto JEDI e ainda existem várias bibliotecas de funções a serem citadas. A coleção de bibliotecas madShi possui oito pacotes, cada um tendo de duas a nove units. Os pacotes madExcept para tratamento de exceções e madCodeHook para API Hooking já foram tratados em artigos anteriores dessa revista. Este artigo visa tratar de alguns aspectos interessantes dos seis pacotes restantes.

O próprio Delphi possui uma vasta biblioteca de funções com vários objetivos. Mesmo assim sempre há a necessidade de se fazer download de bibliotecas de funções na internet ou de se criar uma biblioteca pessoal que possa ser usada em vários projetos.

O objetivo deste artigo não é esmiuçar ou servir de documentação à coleção madShi, até porque o projeto já possui uma documentação que pode ser vista na seção de links. Esta documentação é muito grande, e mesmo assim não é completa levando-se em conta a quantidade de aplicações práticas que essas units podem ter, mas a granularidade dessas necessidades. O uso ou não da biblioteca madShi dependerá muito das necessidades do projeto. Haverá ocasiões em que a biblioteca madShi será a melhor opção, e haverá outras ocasiões onde a coleção não será a melhor saída, mas será a saída mais simples ou rápida.

O pacote madBasic contém oito units com funções de propósito geral. Dentre essas oito as mais úteis no dia-a-dia são a madZip para compressão, a madCrypt para criptografia, a madLists que possui a implementação de alguns tipos de listas que não tem nativamente no Delphi, e a madStrings que possui algumas funções para tratar strings que geralmente são feitas pelo próprio programador.

Se uma empresa já tem a coleção de pacotes madShi os programadores podem considerar essas funções em vez de procurar mais algum pacote de terceiros ou de tentar criar do zero. A seguir algumas das funções da biblioteca.

Compressão: tem o objetivo de eliminar o uso de componentes de compressão complicados para tarefas de compressão simples. A unit madZip fornece um compressor de strings fácil de usar quando o objetivo for simplesmente comprimir strings. Isso pode ser útil onde o problema é espaço e não processamento. Um exemplo é a transmissão, pela internet ou através de um dispositivo de armazenamento, um grande lote de informações que é exportado por um sistema e importado por outro no final do dia (batch).

Criptografia: sem usar componentes de criptografia de terceiros a biblioteca madShi oferece serviços de criptografia chamando-se apenas uma função. O algoritmo utilizado é o "BlowFish". Não é o mais seguro de todos, mas é livre de patentes.

Strings: uma série de funções de busca, quebra, formatação e comparação de strings.

Tools: funções para obter informações do sistema operacional, transformar um método em uma procedure estática ou uma procedure estática em método.

Os pacotes madShell e madTools oferecem funcionalidades para trabalhar com o Shell do Windows (Explorer), arquivos e listagens de diretórios especiais (diretórios cujo local pode mudar de acordo com a instalação, e que geralmente ficam gravados no registro) como o diretório Arquivos de Programas, Windows ou Meus Documentos.

Algumas funções do pacote madShell incluem obter o diretório especial do Windows ou o diretório do sistema. Ideal para usar em processos de instalação e configuração onde um sistema precisa identificar onde é o diretório de sistema do Windows para poder copiar uma dll ou bpl.

Existe também a função GetSpecialFolder que aceita como parâmetro um objeto da coleção TSpecialFolder. Se for passado, por exemplo, sfMyMusic, a função GetSpecialFolder trará o diretório Minhas Músicas do usuário e configuração correntes. A coleção TSpecialFolder tem mais de 60 membros, cada um trazendo um diretório especial diferente. Há neste pacote um conjunto de referências a procedures estáticas ou métodos de objetos feitos para se monitorar eventos do shell. Os eventos monitorados vão desde operações com arquivos (inclusão, exclusão, troca de nome) a mapeamento de unidades de rede.

Funções para listar ShellObjects são úteis para se trabalhar com objetos do sistema operacional que são "navegáveis", mas não são arquivos ou diretórios no sistema de arquivos. Por exemplo, o painel de controle. Embora ele pareça uma pasta em algum lugar do disco, na verdade ele é uma espécie de programa escondido em um módulo do sistema operacional.

A função OS permite identificar qual é o sistema operacional e versão antes que algum recurso seja usado. Por exemplo, no Windows 98 e ME não é possível ter janelas semi-transparentes com a API do Windows, então o sistema operacional pode ser verificado antes de se tentar alterar a propriedade alphablend de um formulário, ou de acessar um diretório que só existiria no Windows NT.

As funções GetFileVersion e FileVersionToStr são especialmente úteis na hora de se gerenciar download de componentes e atualização do sistema. A função GetLongFileName traz o nome longo de um arquivo quando passado como parâmetro um nome curto de 8 caracteres do DOS (com "~") e a GetShortFileName faz o contrário.

NewShortCut é uma maneira fácil de criar um atalho para qualquer programa ou arquivo sem precisar conhecer a fundo a API do Windows. Ao longo do artigo será mostrado o método para criar um atalho sem a NewShortCut e com a NewShortCut.

DisplayMode pode ser usado para listar as resoluções suportadas pelo driver de vídeo corrente e é especialmente útil em aplicações gráficas e games.

O pacote madSecurity pode ser dividido em Accounts, ACE, ACL, Security Objects e Shares. Não será possível estudar exemplos de todos os módulos. Dentre eles é possível citar:

As função Account retorna um objeto da interface IAccount que é uma conta de usuário do Windows. O método CurrentUser retorna o usuário corrente. A função Shares retorna os compartilhamentos (pastas, impressoras ...) de um servidor (uma máquina Windows qualquer da rede que tenha algum compartilhamento).

O pacote madKernel tem funções para se usar recursos não documentados do Windows que a própria API não oferece de maneira tão fácil. madRemote é o pacote necessário para criar processos que interfiram em outros através de comunicação de baixo nível, na verdade escrevendo código executável diretamente no contexto de outro processo. É uma técnica muito avançada e exige conhecimentos teóricos sobre a estrutura dos arquivos PE do Windows, chamadas a procedimentos e assembly. Um exemplo é a CopyFunction, que é usada internamente na coleção madCodeHook. Ela tem o poder de copiar uma função do programa que a chamou para dentro de um outro programa que esteja rodando. Usada em conjunto com a função CreateRemoteThread permite que uma função externa seja executada dentro de um programa já rodando no contexto (variáveis, endereço de memória) dele, e não no contexto de quem disparou a thread. Basicamente essas duas funções juntas fazem injeção e execução de código alheio em processos que já estão executando.

...
Quer ler esse conteúdo completo? Tenha acesso completo