程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 如何移植32位程序到64位系統

如何移植32位程序到64位系統

編輯:關於C語言


最近要將自己的程序兼容64位系統,本來以為是個大工程,可是查閱了相關資料後發現這個其實不難。因為,一般的32位程序都可以運行在64位系統當然是一般情況),這個主要是因為64位系統已經考慮到了這種過渡情況。首先要知道64系統已經為32位的應用程序准備了運行32位程序的環境,這個環境就是WOW64。WOW64 是 Windows-32-on-Windows-64 的縮寫。它為現有的 32 位應用程序提供了 32 位的模擬,可以使大多數 32 位應用程序在無需修改的情況下運行在 Windows 64 位版本上。它類似於舊的 WOW32 子系統,負責在 Windows 32 位版本下運行 16 位的代碼。
下面介紹一點編程中要用到的東西。
1。當然,這裡你還必須用到一個就是,如何判斷系統是32位系統還是64位系統呢?如果你要用小改變是必須知道現在到底是32,還是64。IsWow64返回TRUE則是64位系統,否則為32位系統。code如下:VC測試通過typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);LPFN_ISWOW64PROCESS fnIsWow64Process; BOOL IsWow64() {     BOOL bIsWow64 = FALSE;     fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(         GetModuleHandle(TEXT("kernel32")),"IsWow64Process");     if (NULL != fnIsWow64Process)     {         if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))         {             // handle error             AfxMessageBox("IsWow64 error!");         }     }    return bIsWow64; }2。關於注冊表的情況。如果你去看vista64的注冊表會發現在程序的安裝,卸載等方面,注冊表有很大的改變。但是告訴你個好消息是。你的程序中Wow64下運行。所以其中的改變,你不用理睬,這個WOW64會幫你轉換的。當然這個僅限於標准的一些注冊表的位置變化,具體還要自己多測試。這個變化主要是由於,vista64裡面安裝的64位程序跟32位程序在安裝位置方面有很大的不同,因為多了個program file(x)。比如卸載程序列表:xp 位於如下位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstallvista64位於如下位置:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\但是你如果在vista下訪問如下位置HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall也是沒有問題的。
xp下具體的程序在電腦中的位置位於:HKEY_LOCAL_MACHINE\SOFTWAREvista中是位於HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node如果你在vista64下面依然訪問如下位置,HKEY_LOCAL_MACHINE\SOFTWARE你得到的其實就是vista下HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node的列表。這其中其實是WOW進行了轉換。所以,很多這些你是不用擔心有問題。當然有些非標准的位置,可能有些變化。但是別擔心,這些很少會用到的。
關於WOW64的介紹:
硬件本身具有 32 位兼容性模式,可以處理 IA-32 指令的實際執行,而 WOW 層處理諸如在 32 位和 64 位模式之間切換處理器以及模擬 32 位系統的事務。例如,32 位和 64 位程序具有不同的注冊表配置單元。還有一個用於 32 位二進制文件的不同的系統目錄。64 位二進制文件仍然使用 System32 目錄,因此,當 32 位應用程序安裝到系統中時,WOW 層會確保將 32 位二進制文件置於一個新的目錄 SysWOW64 中。這是通過如下方式實現的:根據應用程序是否運行在 WOW 下,截獲對 API 的調用如 GetSystemDirectory)並返回適當的目錄。相同的問題可能會存在於注冊表中。因為 32 位和 64 位的 COM 服務器都可以安裝在系統上,並位於相同的類標識符 (CLSID) 下,因此 WOW 層需要將對注冊表的調用重定向到適當的 32 位或 64 位配置單元中。WOW 層也會處理注冊表中某些區域之間的鏡像更改,以便使其更簡單地支持 32 位和 64 位代碼之間的交互操作。WOW64 非常重要,因為當不關注性能和可伸縮性的問題時,它使您可以利用大多數現有的 32 位代碼。它是兩種方法的最佳結合。您可以將您的服務遷移到 64 位,同時將 Microsoft 管理控制台 (MMC) 配置管理單元保留為 32 位。Windows 64 位版本包括 MMC 的 32 位和 64 位的版本。當選擇保留管理工具為 32 位時,進程間的通訊可能會遇到某些問題,但是只要接口設計正確,諸如遠程過程調用 (RPC) 的協議應該可以在 32 位和 64 位進程之間運行。有關 WOW64 的另外一點需要牢記:它並不是為要求高性能的應用程序而設計的。至少,WOW64 子系統需要將 32 位參數擴展到 64 位,並且需要將 64 位的返回值截斷為 32 位。在最糟糕的情況下,WOW64 子系統將需要進行內核調用,涉及到的不僅僅是到內核的轉換,還有從處理器的 32 位兼容性模式到其本機 64 位模式的轉換。在 WOW64 下運行時,應用程序將無法妥當地進行調整。對於那些您要將其保留為 32 位的應用程序而言,請在 WOW64 下測試它們。如果性能不能滿足您的期望,您需要考慮將應用程序遷移到 64 位。WOW64 是在用戶模式下實現的,作為 ntdll.dll 和內核之間的層。WOW64 及其支持的一些 DLL 僅僅是可以加載到 32 位進程中的 64 位的 DLL。對於所有其他情況,進程保持為純進程。32 位的進程無法加載 64 位的 DLL,反之亦然。看來上面的你也許就比較清楚了吧。一般程序就不需要什麼移植,但是如果牽涉到驅動方面的東西,比如安裝驅動等,那麼這些是需要移植的。因為驅動是安裝到內核來進行運行的,所以32位的驅動是不行的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved