programa - Función de llamada en c++ dll sin encabezado
incluir un archivo c en otro (6)
Me gustaría llamar a un método desde un dll, pero no tengo el origen ni el archivo de encabezado. Intenté usar dumpbin / exports para ver el nombre del método, pero ¿puedo encontrar la firma de los métodos?
¿Hay alguna manera de llamar a este método?
Gracias,
El lenguaje C ++ no sabe nada sobre dlls.
¿Esto es en Windows? Una forma sería:
- abra el archivo dll en
depends.exe
incluido con (Visual Studio) - verificar la firma de la función que desea llamar
- use
LoadLibrary()
para cargar este dll (tenga cuidado con la ruta) - use
GetProcAddress()
para obtener un puntero a la función que desea llamar - use este puntero a función para hacer una llamada con argumentos válidos
- use
FreeLibrary()
para liberar el controlador
Por cierto: Este método también se conoce comúnmente como vinculación dinámica en tiempo de ejecución en oposición a los enlaces dinámicos en tiempo de compilación donde compila sus fuentes con el archivo
lib
asociado.
Existe algún mecanismo similar para * nixes con dlopen
, pero mi memoria comienza a fallar después de eso. Algo llamado objdump
o nm
debería comenzar con la inspección de la (s) función (es).
Llamar a funciones no externas es una gran manera de romper su programa cada vez que se actualice la DLL de terceros.
Dicho eso, la utilidad undname también puede ser útil.
Si la función es una de C ++, es posible que pueda derivar la firma de la función del nombre destrozado. Dependency Walker es una herramienta que hará esto por usted. Sin embargo, si el archivo DLL se creó con un enlace C (Dependency Walker le dirá esto), entonces no tendrá suerte.
Si realmente sabe o sospecha fuertemente que la función está allí, puede cargar dinámicamente la DLL con loadLibrary y obtener un puntero a la función con getProcAddress. Ver MSDN
Tenga en cuenta que esta es una forma manual y dinámica de cargar la biblioteca; aún tendrá que saber la firma de la función correcta para asignarla al puntero de función para usarla. AFAIK no hay forma de usar el dll en una capacidad de tiempo de carga y usar las funciones sin un archivo de encabezado.
Es posible descubrir una firma de función C analizando el inicio de su desmontaje. Los argumentos de la función estarán en la pila y la función hará algunos "pops" para leerlos en orden inverso. No encontrará los nombres de los argumentos, pero debería poder averiguar su número y los tipos. Las cosas pueden volverse más difíciles con el valor de retorno, puede ser a través del registro ''eax'' o mediante un puntero especial pasado a la función como el último pseudoargumento (en la parte superior de la pila).
Como ha encontrado, la lista de exportaciones en una DLL solo almacena nombres, no firmas. Si su DLL exporta funciones C, probablemente tendrá que desarmar e invertir las funciones para determinar las firmas de método. Sin embargo, C ++ codifica la firma del método en el nombre de la exportación. Este proceso de combinar el nombre y la firma del método se denomina "cambio de nombre" . Esta pregunta tiene una referencia para determinar la firma del método del nombre de la exportación mutilada.
Pruebe la utilidad gratuita "Dependency Walker" (también conocida como "depende") . La opción "Undecorate C ++ Functions" debe determinar la firma de un método C ++.