ID do artigo: 106553 - Última revisão: quinta-feira, 15 de julho de 2004 - Revisão: 2.1 Como gravar DLLs C e chamada-los a partir do Visual Basic
Nesta páginaSumárioEste artigo descreve como usar DLLs com o Visual Basic. Ele aborda os seguintes problemas: A seção
Seção B
Mais InformaçõesUMA SEÇÃO1.0 o que é uma DLL?DLLs (bibliotecas de vínculo dinâmico) são um aspecto importante do Windows. Uma DLL contém funções que o programa executável pode chamar durante a execução. Em outras palavras, uma DLL é uma biblioteca de funções que seu programa pode vincular com dinamicamente.Um link pode ser estático ou dinâmico. Vínculos estáticos não são alterados. Todas as informações endereço necessárias por seu programa para acessar a função de biblioteca é fixo quando o arquivo executável é criado e permanece inalterado durante a execução. Vínculos dinâmicos são criados conforme necessário. Quando seu programa necessita de uma função que não está no arquivo executável, o Windows carrega a biblioteca de vínculo dinâmico (DLL), disponibilizar todas as suas funções para seu aplicativo. Nesse momento, o Windows resolve o endereço de cada função e links-lo dinamicamente para seu aplicativo. Todos os controles personalizados usados no Visual Basic são DLLs. A única diferença é que eles exigem tratamento especial em termos de mensagens recebidas a partir do Visual Basic. 1.1 Por que usar DLLs?Aqui estão quatro motivos por que você deseje usar uma DLL:
1.2 Anatomia de uma DLLCada DLL deve conter uma função LibMain e deve conter um procedimento de sair do Windows (WEP) juntamente com as funções exportadas que podem ser chamados por um programa executável.
Problemas de gerenciamento de memória DLL 1.3Use o modelo de memória grande.C armazena todas as variáveis definidas como estática ou global (definido fora de uma função) na pilha do programa espaço e C armazena todas as outras variáveis na pilha. No modelo de pequeno e médio, todos os ponteiros são próximo por padrão. Isso significa que os dados são acessados por deslocamentos de 16 bits para o registrador de segmento (DS) de dados ou o registrador de segmento (II) de pilha. Infelizmente, o compilador não tem como saber se o deslocamento é de serviço de diretório ou o II. Na maioria dos programas esse não seria um problema porque o DS e SS aponte para o mesmo segmento. Uma DLL, no entanto, é um caso especial. Uma DLL tem seu próprio segmento de dados, mas compartilha sua pilha com o programa de chamada. Isso significa que o DS e o SS não apontam para o mesmo local. A solução mais fácil para esse problema é criar a DLL no modelo de memória grande onde todas as variáveis são referenciadas por um valor de 32 bits. Por que alocar memória dinamicamente?Alocar memória dinamicamente é uma técnica amigável do Windows. Declaração de matrizes grandes de dados ocupa espaço na pilha do programa, que é limitada a 64 K, ou segmento de dados do programa, que desperdiça espaço em disco e memória do Windows. É melhor para Windows pedir a memória quando você precisa dele e liberá-lo quando tiver terminado.Alocando memóriaNo Windows, você pode alocar dinamicamente dois tipos de memória, local e global. Memória local está limitada a 64 K e no caso de uma DLL, local de memória é compartilhada com o programa que chamou a DLL. Memória global é toda a memória disponível para o Windows após ele foi carregado.Local de memória é alocada e gerenciados usando o LocalAlloc, LocalLock LocalUnlock e LocalFree funções--como no exemplo: Global de memória é alocada e gerenciados usando o GlobalAlloc, GlobalLock GlobalUnlock e GlobalFree funções--como no exemplo: Se você quiser compartilhar a memória alocada na DLL com outros programas, você deve alocá-lo usando o sinalizador GMEM_SHARED. Se você quiser compartilhar a memória através de DDE, você deve alocar usando o sinalizador GMEM_DDESHARE. Ser cuidado ao armazenar dados em variáveis estáticasSe você tentar armazenar dados em uma DLL usando variáveis globais ou estáticas, não se surpreenda se esses valores foram alterados quando você chama sua DLL em seguida. Os dados armazenados em dessa forma serão comuns a todos os aplicativos que acessam essa DLL. Não importa como muitos aplicativos usam uma DLL, há apenas uma instância da DLL. A melhor maneira para contornar esse problema é retornar as estruturas da DLL e passá-las em novamente quando forem necessários.Identificadores de arquivoNão é possível compartilhar identificadores de arquivo entre aplicativos ou DLLs. Cada aplicativo tem sua própria tabela de identificador de arquivo. Para que os dois aplicativos usam o mesmo arquivo usando uma DLL, ele devem ambos abrir o arquivo individualmente.1.4 Criação de uma DLL usando o Visual C++Aqui estão as etapas necessárias para criar uma DLL usando o Visual C++:
DLL de 1.5 exemplo CA seguinte DLL contém a função GetDiskInfo, que pode ser chamada a partir do Visual Basic. Ela retornará o espaço em disco disponível, o nome atual da unidade e o nome do volume.LIBRARY diskinfo Observação: O nome LIBRARY no arquivo .def deve ser o mesmo que o nome do arquivo DLL, senão lhe dará do Visual Basic "Erro ao carregar DLL". Por exemplo, crie o arquivo DISKINFO.DLL usando a instrução LIBRARY DISKINFO no arquivo .def acima. Descrição 'GetDiskInfo podem ser chamadas partir do Visual Basic ' EXETYPE WINDOWS 3.1 CÓDIGO PRELOAD MOVÍVEIS DISCARDABLE DADOS PRELOAD ÚNICO MÓVEL HEAPSIZE 4096 EXPORTAÇÕES GetDiskInfo @ 1 SEÇÃO BDLLs de chamada 2.0 a partir do Visual BasicNo Visual Basic, todas as funções, incluindo funções DLL, que você deseja fazer a chamada deve ser declarado primeiro usando a instrução Declare. Você pode declarar suas funções na seção declarações de um formulário ou um módulo. Se você declarar um procedimento DLL ou função em um formulário, é particular para esse formulário. Para tornar pública, você deve declará-lo em um módulo. A seguir está um exemplo de instrução Declare:Depois de declarar a função, você pode chamar e usar a função assim como você poderia chamar e usar uma função do Visual Basic. Parâmetros DLL 2.1Como DLLs normalmente são escritas em C, DLLs podem usar uma ampla variedade de parâmetros não diretamente suportado pelo Visual Basic. Como resultado, quando passar parâmetros, o programador tem que localizar o tipo de dados apropriado para passar.Passando argumentos por valor ou por referênciaPor padrão, o Visual Basic passa todos os argumentos por referência. (Ao passar por referência, Visual Basic fornece um endereço de distância de 32 bits). No entanto, muitas funções DLL esperam um argumento para ser passada por valor. Isso pode ser obtido, colocando a palavra-chave ByVal na frente da declaração de argumento.As seções a seguir mostram como converter parâmetros para o Visual Basic. Parâmetros numéricos de 8 a 16 bitsPasse parâmetros de numéricos de 8 a 16 bits (int, int curto, não assinado, unsigned short, BOOL e WORD) como Integer.Parâmetros numéricos de 32 bitsPassar parâmetros numéricos de 32 bits (tempo, sem sinal longa e DWORD) como LONG.Identificadores de objetoTodos os identificadores são valores de inteiro de 16 bits exclusivo associados a uma janela e são passados por valor, portanto, passar esses parâmetros como Integer.Seqüências de caracteresSeqüências de caracteres incluem os tipos de dados LPSTR e LPBYTE (ponteiro para caracteres) ou ponteiro para caracteres não assinados. Passe esses parâmetros como (ByVal paramname As String). Para passar cadeias de caracteres Visual Basic diretamente, passe-los como (param As String).Para obter informações adicionais sobre passanado seqüências entre Visual Basic e um DLL C, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft: 118643
(http://support.microsoft.com/kb/118643/EN-US/
)
Como passar uma seqüência ou seqüência de matriz entre VB e C uma DLL Observação: Visual Basic seqüências requerem tratamento especial, portanto, não passe seqüências de caracteres diretamente, a menos que a DLL a exija explicitamente. Ponteiros para valores numéricosPasse ponteiros para valores numéricos simplesmente não utilizando a palavra-chave ByVal.EstruturasSe o tipo definido pelo usuário do Visual Basic corresponde à estrutura esperada pela DLL, a estrutura pode ser passada por referência.Observação: Estruturas não podem ser passadas por valor. Ponteiros para matrizesPasse o primeiro elemento da matriz por referência.Ponteiros para funçõesVisual Basic não oferece suporte a funções de retorno de chamada, portanto funções DLL com ponteiros para funções não podem ser usadas com o Visual Basic.Ponteiros nulosSe uma DLL espera um ponteiro nulo, passe para ele como (ByVal paramname as any). Você pode usar 0 & como o valor de paramname ao chamar a DLL.Solução de problemas de 2.2Abaixo estão soluções para alguns problemas que podem ser encontrados.Recursos do sistema manter ponto inferiores após a DLL É chamadaSe sua DLL está usando objetos GDI, você deve lembrar-se liberá-los após usá-los. Isso não pode ser óbvio no Visual Basic, mas quando usando o SDK (software development kit) do Windows se você criar um objeto GDI (por exemplo, CreateBrushIndirect), você deve excluí-la usando ExcluirObjeto posteriormente.Erro de convenção de chamada de DLL incorretoEste erro geralmente é causado por omitindo incorretamente ou incluindo a palavra-chave ByVal da instrução Declare. Este erro também pode ser causado se errado os parâmetros forem passados.Erro ao carregar DLLEste erro ocorre quando você chamar um procedimento dynamic-link library, biblioteca de vínculo dinâmico e o arquivo especificado na instrução Declare do procedimento não pode ser carregado. Você pode usar a função do Microsoft Windows API LoadLibrary para descobrir informações mais específicas sobre por que uma DLL Falha ao carregar.Falha geral de proteção (GP)Falhas GP ocorrem quando seu programa grava em um bloco de memória que não pertence a ele. Os dois motivos provavelmente para isso são:
Programa de chamada do 2.3 exemplo Visual BasicHá duas partes para chamar uma DLL em um programa do Visual Basic. Primeiro declarar a função, e você usá-lo no código do evento.Eis um exemplo de uma instrução Declare. A instrução Declare deve ser colocada em um módulo ou em seção Declaração geral de um formulário. Depois que a função é declarada, você pode usá-lo no código do evento. O exemplo a seguir usa uma função da DLL no código de evento Click de Command1: A informação contida neste artigo aplica-se a:
Tradução automáticaIMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado. Clique aqui para ver a versão em Inglês deste artigo: 106553
(http://support.microsoft.com/kb/106553/en-us/
)
| Outros Recursos Outros Sites de Suporte
ComunidadesObtenha Ajuda AgoraTraduções deste artigo
|






Windows Live
Facebook
Twitter
Linkedin
Digg it
Yahoo
Delicious
StumbleUpon
Yammer
Reddit
Technorati
FriendFeed
Email



Voltar para o início