猿问

如何测试Windows DLL文件以确定它是32位还是64位?

我想编写一个测试脚本或程序,断言给定目录中的所有DLL文件都是特定的构建类型。


我会在SDK的构建过程结束时使用它作为一个健全性检查,以确保64位版本没有以某种方式获得一些32位DLL文件,反之亦然。


有没有一种简单的方法来查看DLL文件并确定其类型?


该解决方案应该适用于xp32和xp64。


人到中年有点甜
浏览 1373回答 3
3回答

摇曳的蔷薇

血淋淋的细节DLL使用PE可执行格式,从文件中读取该信息并不太棘手。有关概述,请参阅有关PE文件格式的此MSDN文章。您需要读取MS-DOS标头,然后读取IMAGE_NT_HEADERS结构。它包含IMAGE_FILE_HEADER结构,其中包含Machine成员中需要的信息,其中包含以下值之一IMAGE_FILE_MACHINE_I386(0x014c)IMAGE_FILE_MACHINE_IA64(0x0200)IMAGE_FILE_MACHINE_AMD64(0x8664)此信息应该在文件中的固定偏移量,但我仍然建议遍历该文件并检查MS-DOS标头和IMAGE_NT_HEADERS的签名,以确保您应对任何未来的更改。使用ImageHelp读取标题...您还可以使用ImageHelp API来做到这一点-加载使用DLL 的LoadImage,你会得到一个LOADED_IMAGE结构,其中将包含一个指向IMAGE_NT_HEADERS结构。使用ImageUnload释放LOADED_IMAGE。...或者适应这个粗糙的Perl脚本这是粗略的Perl脚本,可以完成工作。它检查文件是否有DOS标头,然后从IMAGE_DOS_HEADER 60字节读取PE偏移到文件中。然后它寻求PE部分的开始,读取签名并检查它,然后提取我们感兴趣的值。#!/usr/bin/perl## usage: petype <exefile>#$exe = $ARGV[0];open(EXE, $exe) or die "can't open $exe: $!";binmode(EXE);if (read(EXE, $doshdr, 64)) {&nbsp; &nbsp;($magic,$skip,$offset)=unpack('a2a58l', $doshdr);&nbsp; &nbsp;die("Not an executable") if ($magic ne 'MZ');&nbsp; &nbsp;seek(EXE,$offset,SEEK_SET);&nbsp; &nbsp;if (read(EXE, $pehdr, 6)){&nbsp; &nbsp; &nbsp; &nbsp;($sig,$skip,$machine)=unpack('a2a2v', $pehdr);&nbsp; &nbsp; &nbsp; &nbsp;die("No a PE Executable") if ($sig ne 'PE');&nbsp; &nbsp; &nbsp; &nbsp;if ($machine == 0x014c){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print "i386\n";&nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp;elsif ($machine == 0x0200){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print "IA64\n";&nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp;elsif ($machine == 0x8664){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print "AMD64\n";&nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp;else{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("Unknown machine type 0x%lx\n", $machine);&nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp;}}close(EXE);

红颜莎娜

如果您安装了Cygwin(由于各种原因我强烈推荐),您可以在DLL上使用'file'实用程序file <filename>这将产生这样的输出:icuuc36.dll: MS-DOS executable PE&nbsp; for MS Windows (DLL) (GUI) Intel 80386 32-bit
随时随地看视频慕课网APP
我要回答