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

Traduções de Artigos Traduções de Artigos
Artigo: 131313 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo explica como criar uma biblioteca de importação especificada uma dll para o qual não tiver origem código ou objecto módulos. Não existe nenhum utilitário de 32 bits que pode criar uma biblioteca de importação a partir de uma dll, como existia em versões de 16 bits do Visual C++.

Nota : Este método poderá não funcionar com DLLs geradas com ferramentas de desenvolvimento que não sejam da Microsoft.

Mais Informação

Normalmente, quando criar uma .dll ou qualquer destino que exporta funções ou itens de dados, uma biblioteca de importação (e exporta ficheiro) é gerada como parte do processo de ligação. Mas no caso de uma DLL de outros fabricantes não é fornecido com uma biblioteca de importação, pode necessitar de gerar uma biblioteca de importação para utilizar .dll com êxito utilizando o tempo de carregamento dinâmico ligar. Uma biblioteca de importação não é necessário para a ligação dinâmica run-time.

Existem duas formas para criar uma biblioteca de importação especificada uma .dll:
  • Criar um ficheiro .def para utilização com /DEF LIB: comando.
  • Funções de stub e utilizar os ficheiros .OBJ criados para simular as relações de importação/exportação. Em seguida, utilize /DEF LIB: comando para criar a biblioteca de importação.

Criar um ficheiro .def

Só pode utilizar um ficheiro .def para criar uma biblioteca de importação a partir de uma dll para o qual não tem o código ou módulos de objecto é se a dll exporta funções através de uma interface C. Especificamente, as funções necessário declarada para utilizar a convenção de chamada C. Isto é especificado pelo atributo _cdecl, normalmente utilizado no protótipo para a função. Note que não se for especificado nenhum atributo, _cdecl é a predefinição quando /Gz (_stdcall é a predefinição) ou /Gr (_fastcall é a predefinição) não é especificado na linha comando CL. O motivo para esta limitação é baseado num pressuposto feito o utilitário LIB que todos os nomes são automaticamente exportados sem um carácter de sublinhado à esquerda. Isto só acontece para nomes de funções _cdecl.

Tendo em conta um .dll com funções exportadas através de uma interface C, pode criar uma biblioteca de importação, seguindo estes passos:
  1. Utilize DUMPBIN /EXPORTS < nome do ficheiro .dll > Para obter a lista de símbolos exportados para .dll em questão. Os símbolos aparecem na coluna da tabela "nome" cujos títulos são "Sugestão ordinal nome".
  2. Crie um ficheiro .def que contém uma secção EXPORTS com os nomes das funções listado na coluna "nome" da saída DUMPBIN.
  3. Para funções _cdecl, o símbolo aparece como fosse quando utilizado num programa chamador. Basta colocar este símbolo na secção de ficheiro .def EXPORTS.
  4. Utilizar LIB /DEF: < nome do ficheiro .def > para gerar o ficheiro de biblioteca e exporta de importação. O nome base da biblioteca de importação será o nome do ficheiro .def base. Utilize/OUT: para controlar o nome da biblioteca saída.

Stubbing sem funções

Para funções exportadas utilizam convenções de chamada sejam C, a situação é um pouco mais complexa. Isto é especialmente verdade quando considerar C++ funções e os esquemas de decoração nome mais complexos envolvidos. Para utilizar este método, tem de ter, pelo menos, o ficheiro de cabeçalho que descreve de interface a dll.

Para criar funções stubbed de protótipos num ficheiro de cabeçalho:
  1. Quando "__declspec(dllimport)" é utilizado um protótipo ou uma declaração, altera-o para "__declspec(dllexport)."
  2. Para funções que não devolvem um valor para funções C na origem C e para funções C em C++ código (utilizado com a construção 'externo "C" '), substitua o ponto e vírgula que termina o protótipo de função com um par correspondente de chavetas ("{}").
  3. Para funções de C++ (global ou membro) que devolvem um valor, tem de criar um corpo fictício para a função e devolver um valor fictício o tipo correcto. (Não ter uma instrução return na função é inválido.) Isto vai para a classe funções de membros, bem. Tenha em atenção que o objectivo deste procedimento é levar o utilitário LIB para gerar a biblioteca de importação correcto para que estes corpos fictícias tem efeito.
  4. Para as classes C++, pode stub funções membro utilizando os protótipos de declaração da classe, desde que desactivar a função inlining quando compilar.
  5. Argumentos da função normalmente apenas são especificados por tipo num ficheiro de cabeçalho. Por exemplo, geta(int). Tem de especificar um identificador de argumento fictício quando adicionar o corpo da função fictício Geta(int x). Caso contrário, o erro C2055 é gerado.

Exemplo

Se o ficheiro de cabeçalho que descreve MYDLL.DLL aspecto:
// 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 ficheiro de origem fictício utiliza para criar a biblioteca de importação deverá aspecto:
 // 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 das funções são stubbed, tudo o que precisa de fazer é compilar o ficheiro de origem num ficheiro .OBJ:
LC /c /Ob0 mydll.CPP
NOTA: Desactivar a função inlining é necessária para forçar a geração de símbolos para as funções definidas no CMyClass. Se a função inlining foram activada, o compilador seria Repare que existem sem referências às funções de membro na unidade de conversão, por isso iria rejeitar os corpos de função. Consulte o debate inline função expansão em optimizações na referência da linha de Visual C++ LC comandos.

Quando tiver .OBJ ficheiros, pode utilizar LIB /DEF: para criar a biblioteca de importação (.LIB) e ficheiro exporta (.EXP):
LIB /DEF: mydll.OBJ
Para obter mais informações sobre o comando LIB, consulte a "LIB referência" do Visual C++ Books Online.

Além disso, consulte o seguinte artigo na base de dados de conhecimento da Microsoft:
140485Exportar como PASCAL símbolos na DLL de 32 bits

Propriedades

Artigo: 131313 - Última revisão: 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 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: 131313
Exclusão de Responsabilidade para Conteúdo sem Suporte na KB
Este artigo foi escrito sobre produtos para os quais a Microsoft já não fornece suporte. Por conseguinte, este artigo é oferecido "tal como está" e deixará de ser actualizado.

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