Creación de una biblioteca de importación MSVC desde un archivo DLL que utiliza STDCALL

StackOverflow https://stackoverflow.com/questions/2393178

Pregunta

Tengo un DLL que las exportaciones

extern "C" __declspec(dllexport) int __stdcall Foo( void );

Un volcado de los espectáculos DLL

******************************************************************************
Section:             Exports
File Offset:         00001400 (5120)
  Flags:             00000000
  Time Stamp:        00000000
  Major Version:     0000
  Minor Version:     0000

Exports from simple.dll
  3 exported name(s), 3 export addresse(s).  Ordinal base is 1.
  Sorted by Name:
    RVA      Ord. Hint Name
    -------- ---- ---- ----
    00002104    3 0000 std::nothrow
    00001258    2 0001 Foo
    000020F8    1 0002 ___CPPdebugHook

******************************************************************************

Me comenzó con el siguiente archivo de definición:

LIBRARY simple.dll 
EXPORTS
  Foo

Esto crea un archivo lib con las siguientes exportaciones:

Exports
       ordinal    name
                  _Foo

Cuando me enlace con esta biblioteca, el enlazador msvc se queja de que no puede encontrar _foo @ 0. Para corregir este problema, he añadido un alias en el fichero def.

LIBRARY simple.dll 
EXPORTS
  Foo
  Foo@0=Foo

¿Qué resultados en un archivo lib con las exportaciones

Exports
       ordinal    name
                  _Foo
                  _Foo@0

Ahora los enlaces del proyecto sin ningún tipo de problema. Sin embargo, cuando intento ejecutarlo, me sale el mensaje

"El punto de entrada del procedimiento Foo @ 0 no se encuentra en la biblioteca de vínculos dinámicos simple.dll"

Así que parece que a pesar de que le dije que lib.exe Foo @ 0 es un alias de Foo, todavía crea una biblioteca de importación que intenta cargar "Foo @ 0" por su nombre.

¿Hay una manera de conseguir la biblioteca de importación de carga "Foo" cuando pedí "Foo @ 0"?

Gracias,

David

¿Fue útil?

Solución

tenido la idea correcta tratando de utilizar un alias ...

  

"parece LIB no acepta formas de alias (simplemente ignorará la parte después del signo igual);. 2) que asume todas las funciones en el __cdecl archivo DEF El segundo se encuentra el punto en el hecho de que la biblioteca de importación se produce trazará un mapa de cada símbolo en la DLL a un nombre interno con un guión prefijado, es decir, el enlazador usando la biblioteca de importación intentará resolver un símbolo indefinido _function a la función de símbolos en el archivo DLL. Se necesita ningún cuidado especial de la vocación __stdcall convención. con algunas técnicas que podríamos utilizar LIB para producir bibliotecas de importación para __stdcall funciones, pero la persona que llama sólo podíamos llamarlos por ordinal, no por su nombre. los detalles se dejan como ejercicio :-)." ( http://wyw.dcweb.cn/stdcall.htm )

En lugar de utilizar un alias de utilizar un ordinal: (usando el ejemplo):

LIBRARY simple.dll 
EXPORTS
     Foo
     Foo@0    @2 ;(from your dumpbin)

a mí me funcionó:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top