Como criar uma Dll?

Discussion in 'Portuguese Forum' started by Cableguy, Jul 20, 2007.

  1. Cableguy

    Cableguy Expert Licensed User

    Olá pessoal...

    O Forum Tuga está muito parado...

    Alguém arrisca criar um pequeno tutorial onde, além de mostrar como fazer, explique o porquê das coisas e o seu significado....?

    de preferencia usando o ShrpDevelop, já que é gratuito, ou o VS6Pro...

    Obrigado
     
  2. rodrigoselau

    rodrigoselau New Member

    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
     
    Dany Rocha likes this.
Loading...