Creación de un proyecto C++ para que coincida con una interfaz DLL existente

Tengo una DLL que expone varias funciones y me gustaría hacer una DLL duplicada con el mismo nombre que exponga exactamente las mismas funciones pero con mi propia implementación de cada función.

En este caso, las funciones no harán nada, ya que el propósito es estudiar la funcionalidad para las pruebas unitarias.

Me preguntaba si hay alguna herramienta que pueda tomar una DLL existente y crear un nuevo proyecto C++ (idealmente, Visual C++) que exponga la misma interfaz.

Podría hacerlo manualmente (usando Dependency Walker , también conocido como Depends.exe , para ver las funciones y parámetros expuestos), pero sería mucho más fácil si hubiera una herramienta automatizada para hacerlo.

Si no, ¿por qué no codificar uno y abrirlo? El código abierto siempre se ve bien en el CV/currículum ;-) Buena pregunta, por cierto (+1)

Respuestas (2)

Lo que necesita es en realidad el llamado "Proxy-DLL".

Hay algunas soluciones en la web. Mi favorito es un script de AutoIt publicado (ruso, primer enlace binario, segundo origen) en Habrahabr, que crea un proyecto de VisualStudio 2008/2010 para cualquier archivo DLL. Todas las funciones se reenvían a la DLL original, probablemente desee sobrescribir algunas de ellas.

Creo que no debería ser increíblemente difícil usar algunas secuencias de comandos y hacerlo. No estoy describiendo una solución completa aquí, más como un boceto (ya que no hago desarrollo en Windows), pero:

  • Instale Cygwin (o use los equivalentes de MS Windows de las herramientas de Unix que propongo)
  • Use su Depends.exe para obtener la lista de contenido de DLL
  • (asumiendo que no le importan los módulos y esas cosas) filtre los nombres de las funciones de la salida, usando sedo grep+cut
  • Ahora, para cada firma de función, debe generar un fragmento de código para colocar el .cpp destinado a ser una DLL. Esto probablemente se puede hacer con echouna plantilla, sustituyendo algunas variables por lo que ha obtenido como firma. Y antes de escribir cualquier otra cosa en él, escriba el encabezado inicial que desee.
  • Es posible que también deba hacer lo mismo para un archivo .h (solo las declaraciones).

Ese es el código en sí. En cuanto al archivo del proyecto MSVC, está solo averiguando cómo generarlo.