手邊有個運作多年的程式,安裝在廠商提供的Gateway機器上,呼叫廠商提供的API元件收送資料。
接獲通報,因廠商更換Gateway機器,重裝程式卻無法運作,出現無法讀取HKEY_LOCAL_MACHINE\SOFTWARE\BlahAPI機碼(Registry)錯誤。由於機器、Windows、API元件、.NET程式全都可能異動,一堆變數並存,猶如在一片小籠包間射茶包... orz
初步判斷非API元件版本問題,而檢查Registry的確找不到HKLM\SOFTWARE\BlahAPI,但若真缺少機碼,為何其他相關程式卻運作正常?
查詢API文件發現一則寶貴提示,HKLM\SOFTWARE\Wow6432Node\BlahAPI。啊! Wow6432Node,莫非問題出在32bit vs 64bit!。果然,Windows機碼缺少HKLM\SOFTWARE\BlahAPI,但有HKLM\SOFTWARE\Wow6432Node\BlahAPI。
由此做出推論:
BlahAPI為32位元程式,安裝於Windows 7 x64t時,機碼會寫在HKLM \ SOFTWARE \ Wow6432Node (參考: TIPS-64位元Windows的系統登錄),其他可運作程式為32位元,故能順利讀取HKLM\SOFTWARE\BlahAPI (實際上在HKLM\SOFTWARE\Wow6432Node\BlahAPI)。當.NET程式以64位元模式執行,便出現找不到HKLM\SOFTWARE\BlahAPI錯誤;之前沒出錯,是因為機器原本安裝Windows 7 32bit,所有程式都在32bit模式執行。
使用corflags檢查問題.NET程式的設定(參考: 檢查.NET程式平台目標(Platform Target)),目標平台確實被設為Any CPU,在x64 Windows平台會以64位元程序(Process)執行,佐證以上推測。
知道原因,解決是小事一椿,懶得重新編譯程式,使用corflags 32BIT+ myApp.exe將.NET程式目標平台指定成x86,錯誤便隨風而逝~~ 又成功射下茶包一枚,開心!