ola eu irei te ensinar tudin akii
meu nome e rodrigo tenhu 13 anos e ja fiz um sistema operacional do meu gosto
Hoje 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ção
Nada melhor antes da prática do que uma boa dose de teoria, não é mesmo? Vamos falar um pouco sobre DLL e Arquivos INI.
Dlls
Nos 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 INI
Em 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 INI
Estrutura Banco de Dados
[Clientes]
Nome=Eledio de Souza Junior
Algo 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.
Desenvolvimento
Inicie 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 Long
02. 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 Long
Declare 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 = Empty
End Function
Public Sub WriteINI(ByVal Secao As String, ByVal Chave As String, ByVal Valor As String)
WritePrivateProfileString Secao, Chave, Valor, ArqINI
End Sub
Onde, 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 = Diretorio
End Property
Public Property Get GetDiretorioIni() As String
GetDiretorioIni = ArqINI
End Property
Por ú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 Property
Bom é 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 de ExemploINI. “Desenhe” os controles conforme a tabela seguinte:
Form1 – Propriedade e Controles
Tipo
Propriedades
Form
Name = frmMain
Caption = Principal
BorderStyle = 3 'Fixa
Label
Name = Label
Caption = &Entrada
Index = 0
TextBox
Name = txtEntrada
Text=””
CommandButton
Name = cmdEscrever
Caption = &Escrever
Label
Name = Label
Caption = &Resultado
Index = 1
TextBox
Name = txtResultado
Text=””
CommandButton
Name = cmdLer
Caption = &Ler
Label
Name = Label
Caption = Dire&tório
Index = 2
CommandButton
Name = cmdSair
Caption = &Sair
TextBox
Name = txtDiretorio
Text=””
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 caso ArquivoINI.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.INI
Se 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 & "\Config.INI"
INI.SetDiretorioIni = txtDiretorio.Text
If Not (INI.ExisteArquivo) Then MsgBox "ATENÇÃO: Arquivo '" & INI.GetDiretorioIni & "' não foi Encontrado" & vbNewLine & "Para Execução das Operações será criado um novo arquivo", vbCritical
End Sub
Basta 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 Sub
Private Sub cmdLer_Click()
txtResultado.Text = INI.ReadINI("LOGIN", "ULTUSUARIO")
End Sub
E como sempre o indispensável cmdSair
Private Sub cmdSair_Click()
Unload Me
End Sub
É isso aí, está pronto!!! Caso queira o código fonte clique aqui.
Abraços a todos e fiquem na maravilhosa paz de Jesus.
Todas as coisas cooperam para o bem daqueles que amam a Deus. Rm 8:28