程式搬家出錯的老梗又來了~ 古老的 VB.NET 傳真傳送程式,內部用 CreateObject("Word.Application") 呼叫 Office Word 2003,借重其傳真發送功能。不意外地,原本在 Window 2003 執行得好好的程式,移到 Windows 2008 R2 x64 後水土不服。新主機裝的是 Word 2010,程式出錯,為避免踩到 Word 2003 / Word 2010 差異的地雷,決定在 Windows 2008 R2 上裝 Word 2003。雖然官方文件已言明不支援,實際安裝及測試倒沒啥問題,決定這様頂著先,要改的東西太多,所以就改天吧!
換裝 Word 2003 後程式可手動執行成功,但移入排程後出現錯誤:
System.Exception: 無法建立 ActiveX 元件。 於 Microsoft.VisualBasic.Interaction.CreateObject(String ProgId, String ServerName)
System.Exception: Cannot create ActiveX component. at Microsoft.VisualBasic.Interaction.CreateObject(String ProgId, String ServerName)".
Office 相關程式桌面互動執行OK,移入 Windows Service 或排程出錯,過去已有不少經驗,關鍵是要手動建立 c:\windows\syswow64\config\systemprofile\desktop 資料夾。快手快腳建完目錄,錯誤依舊… 這下糗了,黔驢技窮。
思索了一陣子,由 CreateObject("Word.Application") 得到靈感,建立 ActiveX 物件依賴 Registry,而 Registry 體系 32 位元 64 位元有別,莫非問題與 32/64 有關?使用 corflags 工具檢查程式的目標平台為 AnyCPU,懷疑問題出在排程中程式是在 64 位元模式執行,用 corflags 將程式改為 x86 再試一次,問題排除!特此筆記。
【延伸閱讀】