Cómo crear bibliotecas de importación de 32 bits sin .OBJs u origen

Seleccione idioma Seleccione idioma
Id. de artículo: 131313 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo explica cómo crear una biblioteca de importación dada una DLL para el que no tiene módulos de código o el objeto de origen. No hay ninguna utilidad de 32 bits que puede crear una biblioteca de importación de DLL, como la había en versiones de 16 bits de Visual C++.

Nota : este método no funcionen con archivos DLL generadas con herramientas de desarrollo que no sean de Microsoft.

Más información

Normalmente, cuando generar una DLL o cualquier destino que exporta funciones o elementos de datos, una biblioteca de importación (y exporta el archivo) se genera como parte del proceso de vinculación. Aunque en el caso de una DLL de terceros no se suministra con una biblioteca de importación, puede que necesite generar una biblioteca de importación para usar la .dll correctamente mediante la vinculación dinámica en tiempo de carga. Una biblioteca de importación no es necesario para la vinculación dinámica en tiempo de ejecución.

Hay dos formas de crear una biblioteca de importación dada una DLL:
  • Crear un archivo .def para su uso con el LIB /DEF: comando.
  • Funciones de código auxiliar y utilizar los archivos .obj creados para imitar las relaciones de importación o exportación. Utilizamos el LIB /DEF: comandos para crear la biblioteca de importación.

Crear un archivo .def

La única vez que se puede utilizar un archivo .def para crear una biblioteca de importación desde una DLL que no tiene el código fuente o módulos de objeto es si la DLL exporta funciones a través de una interfaz C. Específicamente, las funciones que han sido declaradas con la convención de llamada de C. Esto se especifica mediante el atributo _cdecl, que normalmente se utiliza en el prototipo de la función. Tenga en cuenta que si no se especifica ningún atributo, _cdecl es el valor predeterminado cuando /GZ (_stdcall es el valor predeterminado) o /GR (_fastcall es el valor predeterminado) no se especifica en la línea de comandos de CL. La razón de esta limitación se basa en una hipótesis realizada por la utilidad LIB que todos los nombres se exportan automáticamente sin un carácter de subrayado inicial. Esto es sólo para nombres de función _cdecl.

Dada una DLL con funciones exportadas mediante una interfaz de C, puede crear una biblioteca de importación; para ello, siga estos pasos:
  1. Use DUMPBIN /EXPORTS < nombre de archivo .dll > Para obtener la lista de símbolos exportados para la DLL en cuestión. Los símbolos aparecen en la columna "nombre" de la tabla cuyos encabezados son "Sugerencia ordinal nombre".
  2. Crear un archivo .def que contiene una sección EXPORTS con los nombres de las funciones enumeradas en la columna "nombre" del resultado DUMPBIN.
  3. Para las funciones de _cdecl, el símbolo aparecerá tal como lo haría cuando se utiliza en el programa de llamada. Simplemente coloque este símbolo en la sección de EXPORTS del archivo .def.
  4. Utilizar LIB /DEF: < nombre de archivo .def > para generar la importación de biblioteca y el archivo de exportaciones. El nombre de base de la biblioteca de importación será el nombre base del archivo .def. Utilice/OUT: para controlar el nombre de la biblioteca de resultados.

Stubbing fuera funciones

De las funciones exportadas que utilizar convenciones de llamada distinto de C, la situación es un poco más compleja. Esto es especialmente cierto cuando considere las funciones de C++ y las combinaciones de decoración de nombre más complejas implicados. Para utilizar este método, debe tener al menos el archivo de encabezado que describe interfaz de la DLL.

Para crear funciones auxiliares de prototipos en un archivo de encabezado:
  1. Cuando se utiliza "__declspec (dllimport)" en una declaración o prototipo, cámbiela a "__declspec (dllexport)".
  2. Para las funciones que no devuelven un valor para las funciones C en código fuente de C y para funciones C en código fuente de C++ (se utiliza con la construcción 'extern "C" '), sustituya el punto y coma que termina el prototipo de función con un par coincidente de llaves ("{}").
  3. Para las funciones de C++ (global o miembro) que devuelve un valor, debe crear un cuerpo ficticio de la función y devolver un valor ficticio del tipo correcto. (No tiene una instrucción return en la función es ilegal). Esto ocurre con las funciones miembro de clase, así. Tenga en cuenta que el propósito de este procedimiento es engañar a la herramienta LIB en generar la biblioteca de importación correcto, por lo que estos cuerpos ficticios tienen efecto.
  4. Para las clases de C++, puede stub fuera de las funciones miembro utilizando los prototipos en la declaración de clase, mientras deshabilita la función inline cuando se compila.
  5. Argumentos de función normalmente sólo se especifican por tipo en un archivo de encabezado. Por ejemplo, geta(int). Al agregar el cuerpo de función ficticio Geta(int x), debe especificar un identificador de argumento ficticio. En caso contrario, el error generado C2055.

Ejemplo

Si el archivo de encabezado que describe MYDLL.DLL tiene un aspecto 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();
};
				
debería parecerse el archivo de origen ficticio que utilizar para generar la biblioteca de importación:
 // 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() {}
 };
				
cuando las funciones son auxiliar, tiene que se compile el archivo origen en un archivo .obj:
CL /c /Ob0 mydll.CPP
Nota: Deshabilitar la función inline es necesario para forzar la generación de símbolos para las funciones definidas en CMyClass. Si se habilitara función inline, sería Observe el compilador que no hay ninguna referencia a las funciones miembro en la unidad de traducción, por lo que podría descartar los cuerpos de función. Vea la explicación en expansión de función en línea en optimizaciones en la referencia de línea de comandos de CL de Visual C++.

Una vez que tiene archivos .obj, se puede utilizar LIB /DEF: para crear la biblioteca de importación (.lib) y el archivo de exportaciones (.exp):
LIB /DEF: mydll.OBJ
Para obtener más información acerca del comando LIB, consulte la "referencia de LIB" en Visual C++ Books Online.

Además, consulte el artículo siguiente en Microsoft Knowledge Base:
140485Exportar símbolos PASCAL-Like en archivos DLL de 32 bits

Propiedades

Id. de artículo: 131313 - Última revisión: martes, 29 de junio de 2004 - Versión: 2.1
La información de este artículo se refiere a:
  • The Microsoft Library Manager (LIB.EXE) sobre las siguientes 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
Palabras clave: 
kbmt kb3rdparty kbcode kbhowto KB131313 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 131313
Renuncia a responsabilidad de los contenidos de la KB sobre productos a los que ya no se ofrece asistencia alguna
El presente artículo se escribió para productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

Enviar comentarios

 

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