7

我真的很喜欢 SysInternals 实用程序(例如 Process Explorer)处理 64 位兼容性的方式。看起来 32 位可执行文件中嵌入了 64 位版本,并在必要时将其提取。

我想要一个自动执行此操作的工具 - 即采用 32 位和 64 位可执行文件,以某种方式将它们打包在一起,并插入存根代码以根据其运行的平台启动正确的可执行文件。

在我开始自己动手之前,有没有人知道这样的事情已经存在?

4

5 回答 5

4

这似乎已经在...中涵盖(尽管细节很浅)

将应用程序的 64 位和 32 位版本滚动到同一个二进制文件中?

于 2009-07-23T09:41:35.390 回答
2

不是工具,但将可执行文件作为资源嵌入到 VC++ 项目中并在检查操作系统环境后运行正确的文件似乎相当容易。

使用 IsWow64Process 函数检测 32 位或 64 位,这里有一篇不错的文章,包括有关如何嵌入可执行文件的源代码:http: //www.codeproject.com/KB/winsdk/binaryresources.aspx

于 2009-07-27T17:27:01.560 回答
2

虽然这是可能的,但我认为这是一种不好的做法,因为大多数应用程序(例如 Process Explorer)将该文件提取到工作目录中。如果您想将程序放在“程序文件”文件夹中,这与该目录是只读的会发生冲突。

对我来说,将两个程序分开并创建 x86 文件的快捷方式似乎更容易。如果该版本检测到 64 位,则只需启动 x64 文件。

如果您有充分的理由将这两者结合起来,那么将其作为资源嵌入似乎是一条正确的道路。

于 2009-07-29T23:52:17.687 回答
2

SysInternals 的 Mark Russinovich 在这里描述了他们的方法。他们确实在 x86 图像中嵌入了 x64 图像。不幸的是,上面的博客文章实际上并没有涉及太多细节,但提到他们的技术是基于在这里找到的一篇更老的文章。

于 2009-08-01T11:03:43.977 回答
0

这是编译完成这项工作的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 位启动器中,并将您的两个可执行文件打包到其中。

于 2014-08-28T20:40:30.490 回答