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

Geo*_*rge 7 c windows dll winapi visual-studio

我需要重建几年前建立的DLL.我有原始的C源代码,但不是Visual Studio项目或解决方案.我想尝试使用最初使用的相同Visual Studio版本重建它.我可以说这是一个普通的旧Windows DLL,而不是.NET.我也知道源代码在C中.通过检查DLL二进制文件,我还能告诉我原始构建环境和工具吗?

谢谢!

Cod*_*ray 21

当然,这完全有可能.关键是所有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等.维基百科上有这些版本号的表(这里你想要的列标有"版本号",因为你想要的版本该连接器,而不是版本的编译器,cl.exe时).其他可能有趣的领域是"操作系统版本"和/或"子系统版本" - 这些将告诉您构建二进制文件的目标版本.例如,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.依此类推.

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