Artigo: 189133 - Última revisão: quinta-feira, 1 de Julho de 2004 - Revisão: 4.1

Como criar DLL C mais acessíveis para VB com uma biblioteca de tipos

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Desde a primeira, Visual Basic forneceu a instrução Declare como um meio para tirar partido das funções DLL escritos em outros idiomas, como, por exemplo, C. Mas instruções Declare são menos perfeitas e requerem frequentemente saber quanto sobre a DLL tal acerca do código Visual Basic. Uma biblioteca de tipos cria uma forma fácil de Visual Basic mais de chamar funções exportadas C.

Este artigo demonstra como criar uma biblioteca de tipos ao criar a DLL e a referência dessa biblioteca do Visual Basic.

Mais Informação

Bibliotecas de tipos são documentos compostos ficheiros (.tlb) utilizados na automatização. Contêm informações importantes sobre a tipos de objectos, módulos e interfaces expostas por um servidor de automatização aos respectivos clientes. Felizmente, um servidor não necessita de automatização-conhecer para tirar partido de uma biblioteca de tipos. De facto, a maior parte das DLL C não são servidores de automatização. É tudo o que é necessário que a DLL C declarar suas funções como membros de um módulo na biblioteca de tipos. Um cliente de automatização, como o Visual Basic, pode ler estas informações e associar à mesma forma que qualquer objecto. Não é necessário para instruções Declare ou hardware não se esqueça constantes vez do Visual Basic efectua automaticamente todo o trabalho.

Existem várias vantagens na criação de uma biblioteca de tipos para a DLL. Mais importante destes é melhor segurança de tipo. Mas também obter a vantagem de um melhor desempenho, porque o Visual Basic liga automaticamente para as funções utilizando o enlace inicial. Por outro lado, todas as instruções Declare são dependentes atrasado. Além disso, obter maior controlo sobre a forma como a DLL é apresentado a programadores de Visual Basic. A biblioteca de tipos permite-lhe fornecer nomes de fácil do Visual Basic para funções e parâmetros, juntamente com os extras útil como enumerações e tipos definidos pelo utilizador (UDTs).

Actualmente, as bibliotecas de tipos são criadas com scripts escritos na interface de definição de idioma (IDL) ou o objecto Descrição idioma (ODL). Estes scripts são compilados, em seguida, utilizar MkTypLib.EXE ou MIDL.EXE fornecidos com o Visual Studio. Visual C++ demora parte do trabalho de criar bibliotecas de tipos, porque os ficheiros ODL que associar o projecto DLL automaticamente deve ser compilados com MIDL quando compilar o projecto.

Exemplo passo a passo - criar a DLL e biblioteca de tipos

  1. Abra o Visual C++ 5.0 e seleccione File|New. No separador ' projectos ', seleccione "Win32 Dynamic-Link Library" e atribua o projecto "TLBSamp."
  2. Seleccione File|New novamente. No separador ficheiros, seleccione "C++ ficheiro de origem," nome "TLBSamp.c", o ficheiro e prima OK.
  3. Repita o passo 2 novamente e escolha este tempo "Ficheiro de texto" como o tipo de ficheiro. Nomes de ficheiros "TLBSamp.def" e "TLBSamp.odl" respectivamente.
  4. Em seguida, adicione o seguinte código ao TLBSamp.c:
          #include <windows.h>
    
          // MyDll_ReverseString -- Reverses the characters of a given string
          void __stdcall MyDll_ReverseString(LPSTR lpString)
          {
             _strrev(lpString);
          }
    
          // MyDLL_Rotate -- Returns bit rotation of 32-bit integer value
          int __stdcall MyDll_Rotate(int nVal, int nDirect, short iNumBits)
          {
             int nRet = 0;
    
             if((iNumBits < 1) || (iNumBits > 31))
                return nRet;
    
             switch(nDirect)
             {
             case 0:
                // Rotate nVal left by iNumBits
                nRet = (((nVal) << (iNumBits)) |
                        ((nVal) >> (32-(iNumBits))));
                break;
             case 1:
                // Rotate nVal right by iNumBits
                nRet = (((nVal) >> (iNumBits)) |
                        ((nVal) << (32-(iNumBits))));
                break;
             }
    
             return nRet;
          }
    
    						
  5. Para tornar as funções exportável, adicione o seguinte TLBSamp.def:
          LIBRARY TLBSamp
          DESCRIPTION 'Microsoft KB Sample DLL'
          EXPORTS
            MyDll_ReverseString
            MyDll_Rotate
    
    						
  6. Declare as funções na biblioteca de tipos, adicionando o seguinte TLBSamp.odl:
          // This is the type library for TLBSamp.dll
          [
          // Use GUIDGEN.EXE to create the UUID that uniquely identifies
          // this library on the user's system. NOTE: This must be done!!
             uuid(F1B9E420-F306-11d1-996A-92FF02C40D32),
          // This helpstring defines how the library will appear in the
          // References dialog of VB.
             helpstring("KB Sample: Make your C DLL More Accessible"),
          // Assume standard English locale.
             lcid(0x0409),
          // Assign a version number to keep track of changes.
             version(1.0)
          ]
          library TLBSample
          {
    
          // Define an Enumeration to use in one of our functions.
          typedef enum tagRotateDirection
          {
             tlbRotateLeft=0,
             tlbRotateRight=1
          }RotateDirection;
    
          // Now define the module that will "declare" your C functions.
          [
             helpstring("Sample functions exported by TLibSamp.dll"),
             version(1.0),
          // Give the name of your DLL here.
             dllname("TLBSamp.dll")
          ]
          module MyDllFunctions
          {
    
             [
             // Add a description for your function that the developer can
             // read in the VB Object Browser.
                helpstring("Returns the reverse of a given string."),
             // Specify the actual DLL entry point for the function. Notice
             // the entry field is like the Alias keyword in a VB Declare
             // statement -- it allows you to specify a more friendly name
             // for your exported functions.
                entry("MyDll_ReverseString")
             ]
             // The [in], [out], and [in, out] keywords tell the Automation
             // client which direction parameters need to be passed. Some
             // calls can be optimized if a function only needs a parameter
             // to be passed one-way.
             void __stdcall ReverseString([in, out] LPSTR sMyString);
    
             [
                helpstring("Rotates a Long value in the given direction."),
                entry("MyDll_Rotate")
             ]
             // Besides specifying more friendly names, you can specify a more
             // friendly type for a parameter. Notice the Direction parameter
             // has been declared with our enumeration. This gives the VB
             // developer easy access to our constant values.
             int __stdcall BitRotate([in] int Value,
                                     [in] RotateDirection Direction,
                                     [in] short Bits);
    
          } // End of Module
          }; // End of Library
    
    						
  7. Compile a biblioteca DLL e tipo escolhendo "Recriar a tudo" do menu de criação. Quando terminar, copie a nova DLL (TLBSamp.dll) para o directório do Visual Basic para efeitos de teste.
NOTA: Como uma questão de conveniência, poderá pretender incluir a biblioteca de tipos no seu DLL como um recurso. Isto irá libertar o utilizador de ter de distribuir um ficheiro TLB separado para programadores do Visual Basic.

Para adicionar a biblioteca como um recurso, efectue os seguintes passos:
  1. Seleccione File|New. No separador ficheiros, seleccione "TLBSamp.rc" de "Ficheiro de texto," nome do ficheiro e, prima ' OK '.
  2. Na janela de texto que aparece, adicione a seguinte linha:

    1 typelib TLBSamp.tlb
  3. Guarde o ficheiro e volte a compilar a DLL. Quando terminar, copie a nova DLL (TLBSamp.dll) para o directório do Visual Basic para testar, substituir o ficheiro anterior se lhe for pedido.

Exemplo passo a passo - O aplicações de teste do Visual Basic

  1. Para testar a DLL e biblioteca de tipos, abra o Visual Basic 5.0 e crie um novo projecto padrão. É criado o Form1 por predefinição.
  2. No menu Project, seleccione referências a chamar mais as referências e, em seguida, clique em Procurar para localizar a nova biblioteca de tipo (ou a DLL) se a biblioteca tiver adicionado como um recurso. Após ter localizado, prima ' OK '. Visual Basic irá automaticamente registar a biblioteca para a primeira vez que referenciá-lo. Certifique-se de que a biblioteca ("KB exemplo: criar a C DLL mais acessível") foi dada as lista de referências e feche a caixa de diálogo.
  3. Prima a tecla F2 para abrir o Object Browser. Tenha em atenção que a biblioteca (TLBSamp) foi adicionado ao projecto do Visual Basic e que agora é possível chamar as funções tal como se fossem funções Basic Visual nativas. Visual Basic irá mesmo pendente a lista de enumeração quando o programador está a escrever o parâmetro de direcção para o BitRotate função.
  4. Adicione um CommandButton ao Form1 e adicione o seguinte código clique o botão evento:
          Private Sub Command1_Click()
             Dim n1 As Long, n2 As Long, nTmp As Long
             Dim sTest As String, sMsg As String
    
             sTest = "Hello World!"
             n1 = 100
    
             ReverseString sTest
               sMsg = sTest & " | "
             ReverseString sTest
               sMsg = sMsg & sTest & vbCrLf
    
             nTmp = BitRotate(n1, tlbRotateLeft, 2)
             n2 = BitRotate(nTmp, tlbRotateRight, 2)
               sMsg = sMsg & Str$(n1) & " : " & Str$(nTmp) & " : " & Str$(n2)
    
             MsgBox sMsg
          End Sub
    
    						
  5. Agora prima a tecla F5 para executar o projecto vb5allB no IDE do.

    NOTA: Se receber uma mensagem de erro, poderá ser porque o Visual Basic não conseguiu encontrar a DLL. Certifique-se de que o copiou para o directório base Visual ou o caminho do sistema antes de executar a aplicação de teste.

Referências

Para obter informações adicionais sobre a estrutura de ODL ou IDL, consulte os seguintes artigos na Microsoft Developer Network (MSDN) Library:
TÍTULO: Tipo de bibliotecas e a linguagem de descrição do objecto
TÍTULO: Definições de interface e bibliotecas de tipos

Para obter informações adicionais, consulte os seguintes artigos na base de dados de conhecimento da Microsoft:
143258  (http://support.microsoft.com/kb/143258/EN-US/ ) : como criar constantes e declarações de DLL na biblioteca de tipos

122285  (http://support.microsoft.com/kb/122285/EN-US/ ) : como adicionar bibliotecas de tipos como recursos de ficheiros .dll e .exe

142840  (http://support.microsoft.com/kb/142840/EN-US/ ) : requisitos de Visual Basic para funções exportadas DLL

(c) Microsoft Corporation 1998, todos os direitos reservados. Contribuições de Richard r. Taylor, Microsoft Corporation

A informação contida neste artigo aplica-se a:
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
Palavras-chave: 
kbmt kbhowto KB189133 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: 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: 189133  (http://support.microsoft.com/kb/189133/en-us/ )