我非常喜欢SysInternals实用程序(例如Process Explorer)处理64位兼容性的方式。看起来32位可执行文件中嵌入了64位版本,并在必要时提取它。
我想要一个自动执行此操作的工具 - 即获取32位和64位可执行文件,以某种方式将它们打包在一起,并插入存根代码以根据其运行的平台启动正确的可执行文件。
在我开始推销自己之前,有没有人知道这样的东西已经存在?
答案 0 :(得分:4)
这似乎已经涵盖在......内部(尽管在细节上相当浅)。
Roll 64-bit and 32-bit versions of an app into the same binary?
答案 1 :(得分:2)
不是一个工具,但将您的可执行文件作为资源嵌入VC ++项目中似乎相当容易,并在检查操作系统环境后运行正确的文件。
使用IsWow64Process函数检测32位或64位,这是一篇很好的文章,包括如何嵌入可执行文件的源代码:http://www.codeproject.com/KB/winsdk/binaryresources.aspx。
答案 2 :(得分:2)
虽然这是可能的,但我认为这是一个不好的做法,因为大多数应用程序(例如Process Explorer)在工作目录中提取该文件。如果您想将程序放在“Program Files”文件夹中,则该目录与该目录是只读的。
对我而言,将两个程序分开并将快捷方式设置为x86文件似乎更容易。如果该版本检测到64位,则只需启动x64文件。
如果您有充分的理由将这两者结合起来,那么将其作为资源嵌入似乎是一条正确的道路。
答案 3 :(得分:2)
SysInternals成名的Mark Russinovich描述了他们的方法here。它们将x64图像嵌入到x86图像中。不幸的是,上面的博文并没有真正涉及太多细节,但提到他们的技术是基于发现here的更老的文章。
答案 4 :(得分:0)
Here is a guide编译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位启动器中,并将两个可执行文件打包到其中。