2009-07-23 12 views
7

我非常喜歡SysInternals實用程序(例如Process Explorer)處理64位兼容性的方式。它看起來像32位可執行文件中嵌入64位版本,並在必要時提取它。任何可用於將32位/ 64位可執行文件打包在一起的工具?

我想要一個可以自動執行此操作的工具 - 即採用32位和64位可執行文件,以某種方式將它們打包在一起,並根據它運行的平臺插入存根代碼以啓動正確的可執行文件。

在我開始推出自己的產品之前,有沒有人知道這樣的東西已經存在?

+0

沒有人能夠識別出這樣做的打包工具,所以我接受了我發現最有用的答案。 – snowcrash09 2009-08-02 16:01:59

回答

2

SysInternals fame的Mark Russinovich描述了他們的方法here。他們確實在x86映像中嵌入了一個x64映像。不幸的是,上面的博客文章實際上並沒有涉及太多的細節,但提到他們的技術是基於發現於here的更老的文章。

2

不是工具已經覆蓋(雖然它在細節上相當淺),但似乎很容易嵌入到你的可執行文件在VC++項目作爲資源,並在檢查操作系統環境後運行正確的。

使用IsWow64Process函數來檢測32或64位,這裏有一個很好的寫法,包括如何嵌入可執行文件的源代碼:http://www.codeproject.com/KB/winsdk/binaryresources.aspx

2

雖然這是可能的,但我認爲這是一種糟糕的做法,因爲大多數這些應用程序(例如Process Explorer)會在工作目錄中提取該文件。如果您想將程序放在「程序文件」文件夾中,則該目錄與只讀目錄發生衝突。

對我來說,將兩個程序分開併爲x86文件創建快捷方式似乎更容易。如果該版本檢測到64位,則只需啓動x64文件。

如果您有充分的理由將這兩者結合起來,那麼將其嵌入資源似乎是一條正確的道路。

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位的發射與包裝成它的兩個可執行文件包裹。

相關問題