Erstellen eines C++-Projekts passend zu einer vorhandenen DLL-Schnittstelle

Ich habe eine DLL, die eine Reihe von Funktionen verfügbar macht, und ich möchte eine doppelte DLL mit demselben Namen erstellen, die genau dieselben Funktionen verfügbar macht, jedoch mit meiner eigenen Implementierung jeder Funktion.

In diesem Fall werden die Funktionen nichts tun, da der Zweck darin besteht, die Funktionalität für Unit-Tests auszuprobieren.

Ich habe mich nur gefragt, ob es Tools gibt, die eine vorhandene DLL nehmen und ein neues C++-Projekt (idealerweise Visual C++) erstellen können, das dieselbe Schnittstelle verfügbar macht.

Ich könnte es manuell tun (mit Dependency Walker , auch bekannt als Depends.exe , um die exponierten Funktionen und Parameter zu sehen), aber es wäre viel einfacher, wenn es ein automatisiertes Tool dafür gäbe.

Wenn nicht, warum codieren Sie nicht einen und öffnen ihn als Open Source? Open Source sieht im Lebenslauf immer gut aus ;-) Gute Frage übrigens (+1)

Antworten (2)

Was Sie brauchen, ist eigentlich eine sogenannte "Proxy-DLL".

Es gibt einige Lösungen im Netz. Mein Favorit ist ein auf Habrahabr veröffentlichtes AutoIt-Skript ( russisch, 1. Link binär, 2. src), das ein VisualStudio 2008/2010-Projekt für jede DLL erstellt. Alle Funktionen werden an die Original-DLL weitergeleitet, einige davon werden Sie wahrscheinlich gerne überschreiben.

Ich denke, es sollte nicht unglaublich schwierig sein, etwas Scripting zu verwenden und das zu erledigen. Ich beschreibe hier keine vollständige Lösung, eher eine Skizze (da ich keine Entwicklung unter Windows mache), aber:

  • Installieren Sie Cygwin (oder verwenden Sie MS Windows-Äquivalente der von mir vorgeschlagenen Unix-Tools)
  • Verwenden Sie Ihre Depends.exe, um die DLL-Inhaltsliste abzurufen
  • (vorausgesetzt, Sie interessieren sich nicht für Module und Zeug) Filtern Sie die Funktionsnamen aus der Ausgabe, indem Sie sedoder grep+ verwendencut
  • Jetzt müssen Sie für jede Funktionssignatur ein Stück Code generieren, um es in die .cpp einzufügen, die als DLL gedacht ist. Dies kann wahrscheinlich mit echound einer Vorlage erfolgen, wobei einige Variablen für das ersetzt werden, was Sie als Signatur erhalten haben. Und bevor Sie irgendetwas anderes hineinschreiben, schreiben Sie den Anfangsheader, den Sie wollen.
  • Möglicherweise müssen Sie dasselbe auch für eine .h-Datei tun (nur die Deklarationen).

Das ist der Code selbst. Was die MSVC-Projektdatei betrifft, müssen Sie selbst herausfinden, wie Sie sie generieren.