Artigo: 106553 - Última revisão: quinta-feira, 15 de Julho de 2004 - Revisão: 2.1 Como escrever DLL C e chamá-los a partir do Visual Basic
Nesta páginaSumárioEste artigo descreve como utilizar as DLL com o Visual Basic. Ele abrange os seguintes problemas: A secção
Secção B
Mais InformaçãoA SECÇÃO1.0 o que é uma DLL?Dll (bibliotecas de ligação dinâmica) são um aspecto importante do Windows. Uma DLL contém funções que pode chamar o programa executável durante a execução. Por outras palavras, uma DLL é uma biblioteca de funções que o programa pode ligar a dinamicamente.Uma hiperligação pode ser estático ou dinâmico. Não alteram ligações estáticas. Todas as informações endereço necessárias pelo programa para aceder a função biblioteca são corrigidas quando o ficheiro executável é criado e permanece sem alterações durante a execução. São criadas hiperligações dinâmicas conforme necessário. Quando o programa necessita de uma função que não está num ficheiro executável, o Windows carrega biblioteca de hiperligação dinâmica (DLL), disponibilizar todas as respectivas funções para a aplicação. Nessa altura, o Windows resolve o endereço de cada função e dinamicamente liga-a à sua aplicação. Todos os controlos personalizados utilizados no Visual Basic são dll. A única diferença é que requerem um tratamento especial em termos de mensagens recebidas a partir do Visual Basic. 1.1 Porquê utilizar dll?Seguem-se quatro razões por que razão poderá pretender utilizar uma DLL:
1.2 Anatomia de uma DLLCada DLL tem de conter uma função LibMain e deve conter um procedimento de sair do Windows (WEP) em conjunto com as funções exportadas que podem ser chamadas por um programa executável.
Problemas de gestão de memória 1.3 DLLUtilize o modelo de memória de grandes dimensões.C armazena todas as variáveis definidas como estático 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 perto por predefinição. Isto significa que os dados são acedidos por desvios de 16 bits para o registo de segmento (DS) de dados ou o registo de segmento (SS) de pilha. Infelizmente, o compilador não tem maneira de saber se o desvio é de directório ou o SS. Na maioria dos programas este não seria um problema porque o DS e SS aponte para o mesmo segmento. No entanto, uma DLL, é um caso especial. Uma DLL tem seu próprio segmento de dados mas partilha a respectiva pilha de com o programa chamador. Isto significa que o DS e a II não apontam para a mesma localização. A solução mais fácil para este problema consiste em criar a DLL do modelo de memória de grandes dimensões em todas as variáveis são referenciadas por um valor de 32 bits. Por que razão atribuição de memória dinamicamente?Ao atribuir memória dinamicamente é uma técnica Windows amigável. Declarar matrizes grandes de dados ocupa espaço na pilha do programa, que está limitada a 64 K, ou segmento de dados do programa, o qual desperdiçam espaço em disco e memória do Windows. É aconselhável pedir ao Windows a memória quando necessário e, em seguida, liberte-quando tiver terminado.Ao atribuir memóriaNo Windows, pode atribuir dinamicamente dois tipos de memória, local e global. Memória local está limitada a 64 K e, em caso de uma DLL, memória local é partilhada com o programa que chamou a DLL. Memória global é tudo da memória disponível para o Windows depois foi carregado.Memória local é atribuída e geridos utilizando o LocalAlloc, LocalLock LocalUnlock e LocalFree funciona--como no seguinte exemplo: É atribuída memória global e geridos utilizando o GlobalAlloc, GlobalLock GlobalUnlock e GlobalFree funciona--como no seguinte exemplo: Se pretender partilhar a memória atribuída na DLL com outros programas, deve atribui-lo utilizando o sinalizador GMEM_SHARED. Se pretender partilhar a memória através de DDE, tem de atribui-lo utilizando o sinalizador GMEM_DDESHARE. Tenha cuidado ao armazenar dados em variáveis estáticosSe tentar armazenar dados de uma DLL utilizando variáveis globais ou estáticas, não se admire se tiverem alterado estes valores quando chamada junto a DLL. Os dados armazenados desta forma serão comuns a todas as aplicações que acedem esta DLL. Independentemente de quantas aplicações utilizam uma DLL, existe apenas uma instância da DLL. A melhor forma de contornar esta é devolver estruturas da DLL e transmiti-los novamente quando forem necessários.Identificadores de ficheiroNão é possível partilhar identificadores de ficheiros entre aplicações ou dll. Cada aplicação tem sua própria tabela de identificador de ficheiro. Para as duas aplicações utilizar o mesmo ficheiro utilizar uma DLL, tem ambos abri-lo individualmente.1.4 Criação de uma DLL utilizando o Visual C++Eis os passos necessários para criar uma DLL utilizando 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. Irá devolver o espaço em disco disponível, o nome da unidade actual e o nome de volume.BIBLIOTECA diskinfo NOTA: O nome da biblioteca no ficheiro .def tem de ser a mesma que o nome do ficheiro DLL ou, então do Visual Basic, obterá "Erro ao carregar a DLL". Por exemplo, crie o ficheiro DISKINFO.DLL utilizando a instrução DISKINFO biblioteca no ficheiro .def acima. Descrição 'GetDiskInfo pode ser chamado a partir do Visual Basic' EXETYPE WINDOWS 3.1 CÓDIGO PRELOAD AMOVÍVEIS DISCARDABLE DADOS PRELOAD ÚNICO MÓVEL HEAPSIZE 4096 EXPORTA GetDiskInfo @ 1 SECÇÃO BDLL de chamada 2.0 a partir do Visual BasicNo Visual Basic, todas as funções, incluindo funções DLL, que pretende efectuar a chamada tem primeiro de ser declarado utilizando a instrução Declare. Pode declarar as funções na secção declarações de um formulário ou um módulo. Se declarar um procedimento DLL ou função de um formulário, é privada para esse formulário. Para o tornar pública, tem de declará-lo num módulo. Segue-se um exemplo instrução Declare:Depois de declarar a função, pode chamar e utilizar a função tal como seria chamar e utilizar uma função do Visual Basic. Parâmetros DLL 2.1Uma vez que as DLL normalmente são escritas em C, dll podem utilizar uma grande variedade de parâmetros não directamente suportados pelo Visual Basic. Como resultado, quando passar parâmetros, o programador tem de localizar o tipo de dados apropriados para passar.Argumentos de passagem por valor ou por referênciaPor predefinição, o Visual Basic passa todos os argumentos por referência. (Quando passar por referência, Visual Basic fornecerá um endereço de extremidade de 32 bits.) No entanto, muitas funções DLL esperam um argumento transmitido por valor. Isto pode ser alcançado, colocando a palavra-chave ByVal à frente da declaração argumento.As secções seguintes mostram como converter parâmetros para o Visual Basic. Parâmetros de numéricos de 8 a 16 bitsPasse parâmetros numéricos 8 a 16 bits (int, int curto, não assinado, curto sem sinal, BOOL e WORD) como número inteiro.Parâmetros de numéricos de 32 bitsPassar parâmetros numéricos de 32 bits (longos e não assinados longa e DWORD) como LONG.Identificadores de objectoTodos os identificadores são valores de número inteiro de 16 bits exclusivo associados a uma janela e transmitidos por valor, para passar estes parâmetros como número inteiro.CadeiasCadeias incluem tipos de dados LPSTR e LPBYTE (apontador de caracteres) ou apontador para caracteres não assinados. Passe estes parâmetros como (ByVal paramname como cadeia). Para passar directamente do Visual Basic cadeias, passa como (parâmetro como cadeia).Para obter informações adicionais em cadeias de passagem entre Visual Basic e um C DLL, consulte o seguinte artigo na base de dados de conhecimento da Microsoft: 118643
(http://support.microsoft.com/kb/118643/EN-US/
)
Como passar uma cadeia ou cadeia de matriz entre o VB e uma DLL C NOTA: as cadeias de Visual Basic requerem tratamento especial, para não passar as cadeias de directamente a menos que a DLL explicitamente requerer. Ponteiros para valores numéricosTransmitir apontadores para valores numéricos, simplesmente não utilizando a palavra-chave ByVal.EstruturasSe o tipo de Visual Basic definido pelo utilizador corresponder a estrutura esperada pela DLL, a estrutura pode ser transmitida por referência.NOTA: Estruturas não podem ser transmitidas por valor. Indicações para matrizesPasse o primeiro elemento da matriz por referência.Apontadores para funçõesVisual Basic não suporta funções de chamada de retorno, pelo que funções DLL com apontadores para funções não pode ser utilizado com o Visual Basic.Ponteiros nulosSe uma DLL espera um apontador nulo, passá-las como (ByVal paramname como qualquer). Pode utilizar 0 & como o valor de paramname ao chamar a DLL.Resolução de problemas 2.2Abaixo se soluções para alguns problemas que poderá encontrar.Recursos do sistema Manter obter inferiores depois da DLL É chamadaLembre-se a DLL estiver a utilizar objectos GDI, tem se liberte-los depois de utilizá-los. Este poderá não ser óbvio no Visual Basic, mas quando utilizar o Windows SDK (software development kit) se criar um objecto GDI (por exemplo, CreateBrushIndirect), terá de eliminá-lo utilizando EliminarObjecto mais tarde.Incorrecto DLL chamadas convenção erroEste erro é frequentemente causado por omissão ou incluindo a palavra-chave ByVal da instrução Declare incorrectamente. Este erro também pode ser provocado se forem transmitidos parâmetros incorrectos.Erro ao carregar a DLLEste erro ocorre quando chamar um procedimento de biblioteca de ligação dinâmica e não é possível carregar o ficheiro especificado na instrução de Declare o procedimento. Pode utilizar a função de API do Microsoft Windows LoadLibrary para obter informações mais específicas sobre porque é que uma DLL Falha ao carregar.Erro geral de protecção (GP)Política de grupo falhas ocorrem quando o programa escreve um bloco de memória que não pertence à mesma. As duas razões mais prováveis para este são:
2.3 Exemplo do Visual Basic chamar programaExistem duas partes para chamar uma DLL num programa do Visual Basic. Primeiro declare a função e, em seguida, utilizar no código de evento.Eis um exemplo de uma instrução Declare. A instrução Declare deverá ser colocada num módulo ou na secção General Declarations de um formulário. Depois da função é declarada, é possível utilizar no código de evento. O exemplo seguinte utiliza uma função de DLL no código de evento em 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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 de Artigos
|






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



Voltar ao topo