最近要將自己的程式相容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_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall
vista64位於如下位置:
HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionUninstall
但是你如果在vista下訪問如下位置
HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionUninstall
也是沒有問題的。
xp下具體的程式在電腦中的位置位於:
HKEY_LOCAL_MACHINESOFTWARE
vista中是位於
HKEY_LOCAL_MACHINESOFTWAREWow6432Node
如果你在vista64下面依然訪問如下位置,
HKEY_LOCAL_MACHINESOFTWARE
你得到的其實就是vista下
HKEY_LOCAL_MACHINESOFTWAREWow6432Node
的列表。
這其中其實是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位的驅動是不行的。