我非常喜欢SysInternals工具(例如Process Explorer)处理64位兼容性的方式。 它看起来像32位可执行文件中embedded64位版本,并在必要时提取它。
我想要一个自动化的工具 – 即采取32位和64位可执行文件,以某种方式将它们打包在一起,并插入存根代码根据运行的平台启动正确的可执行文件。
在我开始推出自己的产品之前,有没有人知道这个已经存在的东西?
SysInternals成名的Mark Russinovich在这里描述了他们的方法。 它们将x64图像嵌入到x86映像中。 不幸的是,上面的博客文章实际上并没有涉及太多的细节,而是提到他们的技术是基于这里发现的更老的文章。
这似乎已经被覆盖了(虽然它在细节上是相当浅的)
将64位和32位版本的应用程序转换为相同的二进制文件?
不是一个工具,但似乎很容易将您的可执行文件作为资源嵌入到VC ++项目中,并在检查操作系统环境后运行正确的文件。
使用IsWow64Process函数来检测32或64位,这里是一个很好的写作,包括如何嵌入可执行文件的源代码: http : //www.codeproject.com/KB/winsdk/binaryresources.aspx 。
虽然这是可能的,但我认为这是一个不好的做法,因为大多数这些应用程序(例如Process Explorer)在工作目录中提取该文件。 如果您想将程序放在“Program Files”文件夹中,则与该目录是只读的冲突。
对我来说,分开两个程序似乎更容易,只是为了x86文件创建快捷方式。 如果该版本检测到64位,则只需启动x64文件。
如果你有充分的理由把这两者结合起来,那么将其视为资源似乎是一条正确的道路。
这里有一个编译AutoIT脚本的指南 ,虽然你无法控制包装和存根启动器的工作方式。
我将在这里重现AutoIT脚本,以防链接消失:
; Check if we're on 64-bit OS… If EnvGet(“PROCESSOR_ARCHITEW6432″)=”” Then ; No we're not – run x86 version… FileInstall(“D:\Support\ETrustCheck_x86.exe”,@TempDir & “\ETrustCheck_x86.exe”) RunWait(“D:\Support\ETrustCheck_x86.exe”,@TempDir & “\ETrustCheck_x86.exe”) FileDelete(@TempDir & “\ETrustCheck_x86.exe”) Else ; Yes we are – run x64 version.. FileInstall(“D:\Support\ETrustCheck_x64.exe”,@TempDir & “\ETrustCheck_x64.exe”) RunWait(“D:\Support\ETrustCheck_x86.exe”,@TempDir & “\ETrustCheck_x64.exe”) FileDelete(@TempDir & “\ETrustCheck_x64.exe”) EndIf ; The END
这个脚本可以被AutoIT脚本编辑器封装到32位启动器中,并将两个可执行文件打包进去。