我可以通过检查 DLL 本身来判断使用哪个版本的 Visual Studio 来构建 DLL吗

问题描述 投票:0回答:1

我需要重建一个多年前构建的 DLL。我有原始的 C 源代码,但没有 Visual Studio 项目或解决方案。我想尝试使用最初使用的相同 Visual Studio 版本来重建它。我可以看出这是一个普通的旧 Windows DLL,而不是 .NET。我还知道源代码是用 C 语言编写的。通过检查 DLL 二进制文件,我还能了解原始构建环境和工具吗?

谢谢!

c windows visual-studio winapi dll
1个回答
39
投票

当然,这是完全可能的。关键是所有 PE 格式映像(可执行二进制文件的 Windows 格式,包括 DLL 和 EXE)都具有包含二进制文件本身的属性和其他信息的标头。 Microsoft 的工具链始终在该标头中设置字段,指示用于构建它的工具的版本。因此,您可以转储该标头并检查这些字段以找出您想知道的内容。

虽然有第三方应用程序可以为您提取和打印此信息,但如果您安装了任何版本的 Visual Studio 或 Windows SDK,获取该信息的最简单方法是 dumpbin。打开 Visual Studio 命令提示符,键入

dumpbin /headers <path to your DLL>
,然后按 Enter。你会得到一个很大的标题数据列表;不要让它吓倒你,你只对几个领域感兴趣。

向上滚动到顶部。对于 DLL,您会看到文件类型是 DLL(显然)。 “FILE HEADER VALUES”部分中的第一个属性有时也很有趣:它告诉您 DLL 是用于 32 位还是 64 位机器。然后查看下一部分“可选链接器值”下的“链接器版本”字段。正如我所提到的,所有 Microsoft 链接器都会使用用于创建二进制文件的链接器版本来填写此信息。格式为major.minor,因此 14.00 是 Visual Studio 2015,10.00 是 Visual Studio 2010,等等。 维基百科上有这些版本号的表格。这里其他可能有趣的字段是“操作系统版本”和/或“子系统版本”——这些字段将告诉您二进制文件是针对哪个版本的 Windows 构建的。例如,10.00 表示 Windows 10,5.01 表示 Windows XP,依此类推。再次,请参阅 Wikipedia 以获取 Windows 版本号表

另一个相关信息可能是您的二进制链接的 C 运行时库 (CRT) 的哪个版本(假设它实际上链接到 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。依此类推。

即使符号已从二进制文件中删除,所有这些仍然有效。

© www.soinside.com 2019 - 2024. All rights reserved.