2016-11-27 55 views
1

我需要重新構建多年前構建的DLL。我有原始的C源代碼,但不是Visual Studio項目或解決方案。我想嘗試使用原來使用的Visual Studio版本重新構建它。我可以說這是一個普通的舊Windows DLL,而不是.NET。我也知道源代碼是用C語言編寫的。還有什麼我可以通過檢查DLL二進制文件來了解原始構建環境和工具嗎?我可以通過檢查DLL本身來告訴Visual Studio的版本是否用於構建DLL

謝謝!

回答

4

當然,這是完全可能的。關鍵在於所有PE格式的圖像(可執行二進制文件的Windows格式,包括DLL和EXE)都具有包含有關二進制本身的屬性和其他信息的標頭。微軟的工具鏈總是在這個頭文件中設置字段,指出用於構建它的工具的版本。因此,您可以轉儲該標題並檢查這些字段以找出您想知道的內容。

儘管有第三方應用程序可以爲您提取並漂亮地打印此信息,但如果您安裝了Visual Studio或Windows SDK的任何版本,最簡單的方法是dumpbin。打開Visual Studio命令提示符,鍵入dumpbin /headers <path to your DLL>,然後按輸入。你會得到一個大頭標數據列表;不要讓它嚇倒你,你只對一些領域感興趣。

滾動到頂部。對於DLL,你會發現文件類型是一個DLL(顯然)。 「FILE HEADER VALUES」部分中的第一個屬性有時也很有趣:它告訴您DLL是用於32位還是64位機器。然後在「鏈接器版本」字段中查看下一節「可選鏈接值」。正如我所提到的,這是由所有Microsoft鏈接器填充用於創建二進制文件的鏈接器的版本。格式是major.minor,因此14.00是Visual Studio 2015,10.00是Visual Studio 2010等。有a table of these version numbers on Wikipedia(您需要的列在此處標記爲「版本號」,因爲您希望版本鏈接器而不是編譯器的版本,cl.exe)。其他可能感興趣的領域是「操作系統版本」和/或「子系統版本」 - 這些將告訴您構建二進制目標的Windows版本。例如,10.00表示Windows 10,5.01意味着Windows XP,等等。再次參見Wikipedia for a table of Windows version numbers

另一個相關的信息可能是你的二進制鏈接(假設它實際上鍊接到CRT)的C運行時庫(CRT)的哪個版本。您也可以使用dumpbin來確定這一點,但這次查看導入。 (或者您可以使用類似於Process Explorer的內容來獲得漂亮的列表。)運行dumpbin /imports <path to your DLL>,然後滾動列表查找以「MSVCR」開頭的內容。名稱的其餘部分表示版本號。 MSVCR80表示VC++ 8或VS 2005.MSVCR90表示VC 9或VS 2008.MSVCR100表示​​VC 10或VS 2010.等等。

所有這些工作,即使符號已從二進制文件中刪除。

+0

謝謝科迪。 我得到了鏈接器版本9.0,操作系統版本5.00和子系統版本5.00。看起來像Visual Studio 2008. 在導入下我看到從KERNEL32.dll導入的多個函數,但沒有別的。這是否意味着C運行時被靜態鏈接?或者有可能,即使通過C寫入,DLL也不需要C運行時?似乎應該可以判斷C運行庫是否靜態地包含在DLL中,對吧? – George

+0

@George - 但你有src的代碼 - 所以可以輕鬆查看使用crt。而不是強制使用相同版本的VS--這只是shell。真正的編譯/鏈接過程取決於cl.exe /鏈接。exe版本,但通常它是兼容的 - 通常用較新的CL編譯的舊代碼,但很可能有很多新的警告。你的問題可以用crt來處理,如果它使用了 - 你可能需要舊的crt headers/libs。如果不是crt - 你可以在任何VS中建立更快的速度,任何鏈接/鏈接 – RbMm

+0

謝謝你們倆。它現在使用Visual Studio 2008進行構建和工作。 – George

相關問題