Autor: Claiton de Oliveira | Publicado: 2011-06-10T06:17:00-07:00

Retirado do site http://imasters.com.br/artigo/3230/visual_basic/criando_minha_primeira_dll/Criando minha primeira DLLHoje vamos falar sobre “Dynamically Linked Libraries”. Com certeza você conhece não é? Não? Tudo bem, deve ser o fato de estar em Inglês. Traduzindo: “Bibliotecas Dinamicamente Ligadas”, agora sim? Ainda não? Então vamos ao popular DLL.Neste artigo vamos analisar como tudo começou e fazer um exemplo simples, bem relativo ao tema “Criando minha primeira DLL”. Não será nenhum exemplo do estilo “Hello World”, mas também nenhum mega-exemplo ensinando como acabar com todos os problemas do Windows, mas sim uma função para Leitura e outra para Escrita em Arquivo INI usando e técnica de implementar o código em DLL.IntroduçãoNada melhor antes da prática do que uma boa dose de teoria, não é mesmo? Vamos falar um pouco sobre DLL e Arquivos INI.DllsNos primórdios da informática os programas eram constituídos apenas de um arquivo executável, onde no mesmo havia todas as informações e instruções necessárias para seu funcionamento, porém como há programas e PROGRAMAS, tínhamos paralelamente aos programas de porte simples os complexos, estes sim, continham diversos executáveis.Com o decorrer do tempo, isso obviamente só aumentou, consideravelmente após o início da utilização de interface gráfica chamada de GUI (Graphical User Interface ou Interface Gráfica de Usuário), que fez com a divisão do programa em vários executáveis se tornasse inviável na questão de produtividade, já que o código entre os executáveis não podia ser compartilhado. Ou seja, se você tinha uma função que era utilizada em todos os executáveis de seu programa, você deveria implementá-la em cada um deles (ou melhor, dizendo fazer em uma e CTRL+C e CTRL+V em outra).Para solução disto, nossos amigos projetistas do Windows começaram a usar uma estratégia denominada “Linkagem Dinâmica”, que resumidamente se explica em: o programador informar no código a localização de uma biblioteca de função (externa ao programa) e o compilador “juntar” as funções da biblioteca com o código implementado pelo programador. Em síntese, as funções são retiradas do arquivo executável e armazenadas em uma biblioteca, contudo, temos inúmeras vantagens, duas das mais relevantes são:Compartilhamento do Código, já que vários executáveis podem se referenciar a mesma biblioteca.Atualizações do Programa se torna mais fácil já que só é preciso alterar as bibliotecas e não o executável evitando ter que reinstalar o programa.Essas bibliotecas são padrões de todos os sistemas da família Windows, como exemplos têm-se as famosas API (Application Program Interface ou Aplicação de Programa de Interface) do Windows, que em grande parte dos casos são baseadas nesse tipo de biblioteca.As APIs (que em resumo são bibliotecas que contêm informações de como devem ser os caixa de textos, botões de comando, caixa de mensagens, etc) propiciam ao programador menos trabalho no desenvolvimento e além de tudo determina uma padronização de interface nos programas.Você deve estar se indagando, “Legal saber tudo isso, mas onde isso me ajuda?”. Sem dúvidas, a principio essa técnica parece um tanto quanto distante da nossa realidade de programação, já que não estamos desenvolvendo nenhum Sistema Operacional (pelo menos eu não), porém, se você analisar com um pouco mais de atenção, notará que isso é ao contrário do que se imagina. Vou citar dois exemplos práticos:01. Digamos que você tem uma função que serve para que o usuário via e-mail entre em contato com você para esclarecimento de dúvidas. Tudo bem até aí, porém você possui 15 aplicações que se utilizam dessa mesma função. Certo dia você precisa mudar o e-mail de contato, como fazer? Gerar um novo executável de cada uma das aplicações informando o novo e-mail de contato e enviar aos clientes, sim pode ser, ou deixar essa função em uma DLL, assim, você não precisa dispor uma nova compilação do executável, somente da DLL que contém a função.02. Você desenvolveu uma função super útil e quer que todos “desfrutem” da mesma função, porém não quer disponibilizar o código em si (mui amigo você em!!!), como fazer? Simples, coloque a função em uma DLL, nela seu código estará 100% seguro (pelo menos até onde conheço não existem “decompiladores” para DLL) e todos podem utilizar a sua função.Arquivos INIEm resumo são arquivos utilizados para armazenamento e recuperação de dados, como um exemplo bastante simples de utilização, podemos citar o armazenamento da posição Top e Left do Form no momento em que o mesmo foi fechado, para que quando seja aberto novamente se se posicione onde estava anteriormente.A estrutura funcional de um Arquivo INI é similar a um banco de dados, onde temos:Seções: Conjunto que contêm chaves e Valores, em analogia a um Banco de Dados pode-se dizer que é a Tabela.Chaves: Usado para Identificação correta dos Valores, em analogia a um Banco de Dados pode-se dizer que é o Campo.Valores: É usado para atribuição de um Valor a uma chave, em analogia a um Banco de Dados pode-se dizer que é o Dado contido no Campo.Estrutura Arquivo INIEstrutura Banco de Dados[Clientes]Nome=Eledio de Souza JuniorAlgo que acho importante mencionar é que as operações feitas em Arquivos INI, tanto de leitura como de escrita não retornam nenhum erro, assim, se o Arquivo INI não existir e você tentar ler algum valor de uma chave ele retornará "" (vazio), caso tente escrever ele criará o arquivo, a seção e a chave e definirá o valor informado, fica a seu critério avaliar até que ponto esse “não retorno de erro” pode ajudar ou não.DesenvolvimentoInicie o Visual Basic, na tela New Project, escolha a opção ActiveX DLL.Renomeie o Projeto como ArquivoINI e a classe criada: INI, e nada mais prático do que falar de DLL usando uma, na classe Main declare as seguintes APIs, sendo a primeira para Escrita e a segunda Leitura no Arquivo INI:01. Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long02. Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As LongDeclare a seguinte Variável para armazenamento e recuperação do diretório do arquivo INI.Private ArqINI as String   Implemente as seguintes funções:   Public Function ReadINI(ByVal Secao As String, ByVal Chave As String)   Dim RET As String   RET = Space$(255)   RetLen = GetPrivateProfileString(Secao, Chave, "", RET, Len(RET), ArqINI)   RET = Left$(RET, RetLen)   ReadINI = RET   RET = EmptyEnd FunctionPublic Sub WriteINI(ByVal Secao As String, ByVal Chave As String, ByVal Valor As String)WritePrivateProfileString Secao, Chave, Valor, ArqINIEnd SubOnde, a primeira utiliza a API GetPrivateProfileString serve para Ler dados do Arquivo INI baseando-se na Seção e Chave passada a ela, e a segunda por sua vez, utiliza a API WritePrivateProfileString serve para Escrever no Arquivo INI.Agora vamos criar duas propriedades para nossa DLL uma delas para “setar” o Diretório do Arquivo INI, e outra para Retornar o Diretório do Arquivo INI, são elas:Public Property Let SetDiretorioIni(ByVal Diretorio As String)     ArqINI = DiretorioEnd PropertyPublic Property Get GetDiretorioIni() As String     GetDiretorioIni = ArqINIEnd PropertyPor último (na questão de funções) vamos fazer uma função para verificar a existência do arquivo informado. Para isso usaremos a função Dir que é intrínseca (padrão) no VB, a mesma recebe o diretório e o tipo a ser validado, no caso um Arquivo. Se o seu retorno for “” (vazio) então o arquivo não existe, caso contrário retornará o nome do arquivo, o código segue abaixo.Public Property Get ExisteArquivo() As Boolean    ExisteArquivo = IIf(Dir(ArqINI, vbArchive) = "", False, True)End PropertyBom é isso. Aí está sua primeira DLL implementada, simples, porém funcional. Agora compile sua DLL no Diretório System32 da sua pasta Windows.Agora vamos utilizá-la. Para isso crie um novo projeto Standard EXE e nomeie-o deExemploINI. “Desenhe” os controles conforme a tabela seguinte:Form1 – Propriedade e ControlesTipoPropriedadesFormName = frmMainCaption = PrincipalBorderStyle = 3 'FixaLabelName = LabelCaption = &amp;EntradaIndex = 0TextBoxName = txtEntradaText=””CommandButtonName = cmdEscreverCaption = &amp;EscreverLabelName = LabelCaption = &amp;ResultadoIndex = 1TextBoxName = txtResultadoText=””CommandButtonName = cmdLerCaption = &amp;LerLabelName = LabelCaption = Dire&amp;tórioIndex = 2CommandButtonName = cmdSairCaption = &amp;SairTextBoxName = txtDiretorioText=””Para podermos utilizar as funções da DLL criada anteriormente devemos nos referenciar a ela, para isso, no menu Project escolha o item References, e localize a sua DLL, no casoArquivoINI.dll, caso ela não esteja na lista clique em Browse e a localize.Feito isso vá ao código do frmMain e faça a declaração da classe da seguinte forma:Private INI As New ArquivoINI.INISe você não entendeu o que está acontecendo, calma, é o seguinte, você para utilizar uma função de uma determinada classe de uma biblioteca precisa ter a mesma declarada, no exemplo acima declaremos o objeto INI do tipo ArquivoINI.INI.No evento load do form vamos informar o diretório do arquivo INI a ser utilizado (no exemplo será no diretório do executável com o nome de config.ini) e também para enfatizaremos a função de verificação de existência do arquivo:Private Sub Form_Load()   txtDiretorio.Text = App.Path &amp; "\Config.INI"   INI.SetDiretorioIni = txtDiretorio.Text    If Not (INI.ExisteArquivo) Then MsgBox "ATENÇÃO: Arquivo '" &amp; INI.GetDiretorioIni &amp; "' não foi Encontrado" &amp; vbNewLine &amp; "Para Execução das Operações será criado um novo arquivo", vbCriticalEnd SubBasta agora implementar os botões de leitura e escrita no arquivo, no evento click dos CommandButton cmdLer e cmdEscrever, conforme a seguir:Private Sub cmdEscrever_Click()   INI.WriteINI "LOGIN", "ULTUSUARIO", Trim(txtEntrada.Text)End SubPrivate Sub cmdLer_Click()   txtResultado.Text = INI.ReadINI("LOGIN", "ULTUSUARIO")End SubE como sempre o indispensável cmdSairPrivate Sub cmdSair_Click()   Unload MeEnd SubÉ isso aí, está pronto!!! Caso queira o código fonte clique aqui.