微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

确定可执行文件或库是32位还是64位在Windows上

我试图找出一个给定的可执行文件(或库)是从Python编译为32位还是64位。 我正在运行Vista 64位,并想确定某个目录中的某个应用程序是否编译为32位或64位。

有没有简单的方法来做到这一点只使用标准的Python库(目前使用2.5.4)?

Windows上有可执行模块的理想大小吗?

Python:使用wmi远程启动可执行文件

PE文件格式 – 节表和第一节之间是什么?

有没有办法知道可执行文件后执行的时间?

我应该在Windows中存储一个可执行程序?

这个Windows API是GetBinaryType 。 你可以使用pywin32从Python中调用它:

import win32file type=GetBinaryType("myfile.exe") if type==win32file.SCS_32BIT_BINARY: print "32 bit" # And so on

如果你想在没有pywin32的情况下这样做,你必须自己读取PE头 。 这是C#中的一个例子 ,下面是Python的一个快速端口:

import struct IMAGE_FILE_MACHINE_I386=332 IMAGE_FILE_MACHINE_IA64=512 IMAGE_FILE_MACHINE_AMD64=34404 f=open("c:windowsexplorer.exe","rb") s=f.read(2) if s!="MZ": print "Not an EXE file" else: f.seek(60) s=f.read(4) header_offset=struct.unpack("<L",s)[0] f.seek(header_offset+4) s=f.read(2) machine=struct.unpack("<H",s)[0] if machine==IMAGE_FILE_MACHINE_I386: print "IA-32 (32-bit x86)" elif machine==IMAGE_FILE_MACHINE_IA64: print "IA-64 (Itanium)" elif machine==IMAGE_FILE_MACHINE_AMD64: print "AMD64 (64-bit x86)" else: print "UnkNown architecture" f.close()

如果您在Windows上运行Python 2.5或更高版本,则还可以使用Windows API而不使用pywin32通过使用ctypes。

from ctypes import windll,POINTER from ctypes.wintypes import LPWSTR,DWORD,BOOL SCS_32BIT_BINARY = 0 # A 32-bit Windows-based application SCS_64BIT_BINARY = 6 # A 64-bit Windows-based application SCS_DOS_BINARY = 1 # An MS-DOS-based application SCS_OS216_BINARY = 5 # A 16-bit OS/2-based application SCS_PIF_BINARY = 3 # A PIF file that executes an MS-DOS-based application SCS_POSIX_BINARY = 4 # A POSIX-based application SCS_WOW_BINARY = 2 # A 16-bit Windows-based application _GetBinaryType = windll.kernel32.GetBinaryTypeW _GetBinaryType.argtypes = (LPWSTR,POINTER(DWORD)) _GetBinaryType.restype = BOOL def GetBinaryType(filepath): res = DWORD() handle_nonzero_success(_GetBinaryType(filepath,res)) return res

然后像使用win32file.GetBinaryType一样使用GetBinaryType。

请注意,你将不得不实现handle_nonzero_success,如果返回值为0,基本上会引发异常。

在进行这种调整之后,我能够在Python 3.5程序中成功地使用Martin B的答案:

s=f.read(2).decode(encoding="utf-8",errors="strict")

最初它在Python 2.7中的工作很好,但在做了其他必要的修改之后,我发现我得到了b'MZ,解码似乎解决了这个问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐