Ich muss eine DLL neu erstellen, die vor Jahren zuletzt erstellt wurde. Ich habe den ursprünglichen C-Quellcode, aber nicht das Visual Studio-Projekt oder die Projektmappe. Ich möchte versuchen, es neu zu erstellen, indem ich dieselbe Visual Studio-Version verwende, die ursprünglich verwendet wurde. Ich kann sagen, dass dies eine einfache alte Windows-DLL ist, nicht .NET. Ich weiß auch, dass der Quellcode in C ist. Gibt es noch etwas, was ich über die ursprüngliche Build-Umgebung und die Tools sagen kann, indem ich die DLL-Binärdatei untersuche?
Vielen Dank!
Sicher, das ist absolut möglich. Der Schlüssel ist, dass alle Bilder im PE-Format (das Windows-Format für ausführbare Binärdateien, einschließlich DLLs und EXEs) Header haben, die Attribute und andere Informationen über die Binärdatei selbst enthalten. Die Toolchain von Microsoft legt immer Felder in diesem Header fest, die die Version der Tools angeben, die zum Erstellen verwendet wurden. Sie können also einfach diesen Header ausgeben und diese Felder untersuchen, um herauszufinden, was Sie wissen möchten.
Es gibt zwar Anwendungen von Drittanbietern, die diese Informationen für Sie extrahieren und verschönern können, aber wenn Sie eine Version von Visual Studio oder das Windows SDK installiert haben, ist dumpbin der einfachste Weg, um darauf zuzugreifen. Öffnen Sie eine Visual Studio-Eingabeaufforderung, geben Sie ein dumpbin /headers <path to your DLL>
und drücke Eintreten. Sie erhalten eine große Liste von Header-Daten; Lassen Sie sich davon nicht einschüchtern, Sie interessieren sich nur für ein paar Bereiche.
Scrollen Sie nach oben. Bei einer DLL sehen Sie, dass der Dateityp (offensichtlich) eine DLL ist. Auch die erste Eigenschaft im Abschnitt “FILE HEADER VALUES” ist manchmal interessant: Sie sagt Ihnen, ob die DLL für einen 32-Bit- oder einen 64-Bit-Computer ist. Suchen Sie dann im nächsten Abschnitt “OPTIONALE LINKER-WERTE” nach dem Feld “Linker-Version”. Dies wird, wie ich bereits erwähnt habe, von allen Microsoft-Linkern mit der Version des Linkers ausgefüllt, der zum Erstellen der Binärdatei verwendet wurde. Das Format ist major.minor, also ist 14.00 Visual Studio 2015, 10.00 ist Visual Studio 2010 usw. Es gibt eine Tabelle dieser Versionsnummern auf Wikipedia (Die gewünschte Spalte ist hier mit “Versionsnummer” beschriftet, da Sie die Version der Linker, nicht die Version des Compilers, cl.exe). Andere potenziell interessante Felder hier sind die „Betriebssystemversion“ und/oder „Subsystemversion“ – diese geben an, für welche Version von Windows die Binärdatei erstellt wurde. Beispielsweise bedeutet 10.00 Windows 10, 5.01 bedeutet Windows XP und so weiter. Wieder sehen Wikipedia für eine Tabelle mit Windows-Versionsnummern.
Eine weitere relevante Information könnte sein, welche Version der C-Laufzeitbibliothek (CRT) Ihre Binärdatei verknüpft (vorausgesetzt, dass sie tatsächlich mit der CRT verknüpft ist). Sie können dies auch mit dumpbin ermitteln, aber diesmal mit Blick auf die Importe. (Oder Sie können etwas wie verwenden Process Explorer um eine hübsch gedruckte Auflistung zu erhalten.) Run dumpbin /imports <path to your DLL>
, und scrollen Sie dann durch die Liste und suchen Sie nach etwas, das mit “MSVCR” beginnt. Der Rest des Namens gibt die Versionsnummer an. MSVCR80 bedeutet VC++ 8 oder VS 2005. MSVCR90 bedeutet VC 9 oder VS 2008. MSVCR100 bedeutet VC 10 oder VS 2010. Und so weiter.
All dies funktioniert auch dann, wenn Symbole aus der Binärdatei entfernt wurden.