Como criar bibliotecas de importação de 32 bits sem .OBJs ou fonte

Traduções deste artigo Traduções deste artigo
ID do artigo: 131313 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo explica como criar uma biblioteca de importação fornecida um .dll para o qual não módulos de código ou objeto de origem tem. Não há nenhum utilitário de 32 bits que pode criar uma biblioteca de importação de uma dll, como havia em versões de 16 bits do Visual C++.

Observação : este método não funcionem com DLLs geradas com ferramentas de desenvolvimento que não sejam da Microsoft.

Mais Informações

Normalmente, quando criar uma .dll ou qualquer destino que exporta itens de dados, uma biblioteca de importação ou funções (e exporta arquivo) será gerado como parte do processo de vinculação. Mas no caso de uma .dll de terceiros não é fornecido com uma biblioteca de importação, você precisa gerar uma biblioteca de importação para usar o .dll com êxito usando vinculação dinâmica do tempo de carregamento. Uma biblioteca de importação não é necessário para a vinculação dinâmica do tempo de execução.

Há duas maneiras para criar uma biblioteca de importação fornecida uma .dll:
  • Criar um arquivo .def para uso com /DEF LIB: comando.
  • Criar um stub de funções e usar os arquivos .obj criados para imitar os relacionamentos de importação/exportação. Em seguida, use /DEF LIB: comando para criar a biblioteca de importação.

Criar um arquivo .def

A única vez em que você pode usar um arquivo .def para criar uma biblioteca de importação a partir de um .dll para o qual você não tem o código-fonte ou módulos de objeto é se o .dll exporta funções por meio de uma interface C. Especificamente, as funções precisará ter sido declarada para usar a convenção C de chamada. Isso é especificado pelo atributo _cdecl, normalmente usado o protótipo da função. Observe que, se nenhum atributo for especificado, _cdecl é o padrão quando /gz (_stdcall é o padrão) ou /Gr (_fastcall é o padrão) não for especificada na linha de comando CL. O motivo para essa limitação é baseado em uma pressuposição feita pelo utilitário LIB que todos os nomes são automaticamente exportados sem um sublinhado à esquerda. Isso vale apenas para nomes de função _cdecl.

Dado um .dll com funções exportadas por meio de uma interface C, você pode criar uma biblioteca de importação seguindo estas etapas:
  1. Use DUMPBIN /EXPORTS < nome do arquivo .dll > Para obter a lista de símbolos exportados para a dll em questão. Os símbolos aparecem na coluna "nome" da tabela cujos títulos são "nome do ordinal de dica".
  2. Crie um arquivo .def que contém uma seção EXPORTS com os nomes das funções listadas na coluna "nome" da saída DUMPBIN.
  3. Para funções _cdecl, o símbolo aparecerá exatamente como ele faria quando usado no programa de chamada. Coloque esse símbolo apenas na seção EXPORTS do arquivo .DEF.
  4. Usar /DEF LIB: < nome do arquivo .def > para gerar o arquivo de biblioteca e exportações de importação. O nome de base da biblioteca de importação será o nome base do arquivo .DEF. Use/OUT: para controlar o nome da biblioteca de saída.

Arrancar sem funções

Para funções exportadas que usam convenções de chamada diferente de C, a situação é um pouco mais complexa. Isso é especialmente verdadeiro quando você considera funções C++ e os esquemas de decoração de nome mais complexos envolvido. Para usar esse método, você deve ter pelo menos o arquivo de cabeçalho que descreve a interface da .dll.

Para criar funções de resto de protótipos em um arquivo de cabeçalho:
  1. Quando "__declspec(dllimport)" é usado em um protótipo ou declaração, alterá-lo para "__declspec(dllexport)."
  2. Para funções que não retornam um valor, para funções C na fonte de C e para funções C no código-fonte C++ (usada com a construção 'extern "C" '), substitua o ponto-e-vírgula que encerra o protótipo de função com um par correspondente de chaves ("{}").
  3. Para funções C++ (global ou membro) que retornam um valor, você deve criar um corpo fictício para a função e retornar um valor fictício de tipo adequado. (Sem uma instrução de retorno na função é ilegal.) Isso vale para classe funções de membro, como também. Tenha em mente a finalidade deste procedimento é enganar o utilitário LIB para gerar a biblioteca de importação correto, para que esses corpos fictícios tenham efeito.
  4. Para classes de C++, você pode stub funções membro usando os protótipos da declaração de classe, desde que você desabilitar função inlining quando você compilar.
  5. Argumentos da função normalmente são especificados pelo tipo em um arquivo de cabeçalho. Por exemplo, Geta(int). Um identificador fictício argumento deve ser especificado ao adicionar o corpo da função fictício Geta(int x). Caso contrário, o erro C2055 é gerado.

Exemplo

Se o arquivo de cabeçalho que descreve MYDLL.DLL parece como:
// mydll.H

extern "C" __declspec(dllimport) void _stdcall Function(void);

class __declspec(dllimport) CMyClass {
     int a;
     long b;
public:
     int Geta(int);
     long Getb();
     CMyClass();
};
				
o arquivo de origem fictício usar para criar a biblioteca de importação deve ter aparência:
 // mydll.CPP

 extern "C" __declspec(dllexport) void _stdcall Function(void) {}

 class __declspec(dllexport) CMyClass {
      int a;
      long b;
 public:
      int Geta(int x) {return 111;}
      long Getb() {return 111;}
      CMyClass() {}
 };
				
depois que as funções são stubbed check-out, tudo o que você precisa fazer é compilar o arquivo de origem em um arquivo .obj:
CL /c/Ob0 mydll.CPP
Observação: Desabilitar função inlining é necessária para forçar a geração de símbolos para as funções definidas no CMyClass. Se função inlining estivesse habilitada, o compilador poderia Observe que há não referências para as funções de membro na unidade de conversão, portanto, ele deve descartar os corpos de função. Consulte a discussão em expansão de função in-line em otimizações na referência de linha de comando do Visual C++ CL.

Depois que você tiver arquivos .obj, você pode usar /DEF LIB: para criar a biblioteca de importação (.lib) e arquivo de exportações (.EXP):
/DEF LIB: mydll.OBJ
Para obter mais informações sobre o comando LIB, consulte a "referência LIB" no Visual C++ Books Online.

Além disso, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft:
140485Exportando PASCAL como símbolos em DLLs de 32 bits

Propriedades

ID do artigo: 131313 - Última revisão: terça-feira, 29 de junho de 2004 - Revisão: 2.1
A informação contida neste artigo aplica-se a:
  • The Microsoft Library Manager (LIB.EXE) nas seguintes plataformas
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 5.0 Standard Edition
Palavras-chave: 
kbmt kb3rdparty kbcode kbhowto KB131313 KbMtpt
Traduçã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 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: 131313
Aviso de Isenção de Responsabilidade sobre Conteúdo do KB Aposentado
Este artigo trata de produtos para os quais a Microsoft não mais oferece suporte. Por esta razão, este artigo é oferecido "como está" e não será mais atualizado.

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com