先前寫過Word套表服務,透過C#程式呼叫Word進行文字置換並轉存PDF,包裝成Windows Service執行並透過ASP.NET Web API接受需求。

程式在開發環境與測試環境運作良好,部署到正式環境Windows Server 2003卻遇上麻煩。

首先,套表程式的Windows Service先前在開發機Windows 2008 R2跟測試台Windows 2003的執行身份都是設成Local System,運行無誤,但正式台Windows 2003上Word存檔時卻一直冒出:

System.Runtime.InteropServices.COMException (0x8001010A): The message filter indicated that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER))

直到我將執行身分改換成網域帳號上述錯誤才消失(但為何Local System不行? 原因成謎),接著卻冒出另一個錯誤:

Exception from HRESULT: 0xC0000005 Stack Trace : at Microsoft.Office.Interop.Word. Find.get_Replacement() ...

很幸運地找到一篇相同情境的MSDN論壇文章,追到一篇KB指出問題是Excel 95的COM GUID與Word Interface打架(詳情可以看這篇),KB提供了兩種解決方式:

  1. 程式改採Late Binding
  2. 使用regtlib.exe重新註解Word元件壓過Excel 95的設定

非常不爽為此改寫程式,一來工程浩大,二來為了Excel **95**改程式感覺太窩囊,故決定動用regtlib撥亂反正!! 有趣的是,找不到regtlib.exe,上網查才發現它是Visual Studio 6.0時代的產物(2007年出廠... orz),Windows 7之後改由.NET 2.0 Framework的regtlibv12.exe接任,找到Word元件(MSWORD.OLB)所在路徑,執行以下指令註冊:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>regtlibv12.exe "C:\Program Files\Microsoft Office\Office12\MSWORD.OLB"
Registration of C:\Program Files\Microsoft Office\Office12\MSWORD.OLB successful
.

問題排除,搞定收工~

PS: 覆寫Excel 5.0介面會有後遺症嗎? 依KB的說法:
Several globally unique identifiers (GUIDs) that are used by Word for its interface identifiers were used by Excel 5.0 for an older object model that is now obsolete.
衝突的GUID用於Excel 5.0 Disinterface,已被宣告為過時避免使用,理論上風險不高,如真有問題,那就是命囉~ XD


Comments

# by Louis

看到黑暗大提到使用C#處理Word檔案,想請問黑暗大有見過使用C#插入CAD物件到Word相關的技術嗎@@?

# by Jeffrey

to Louis, 對CAD物件毫無研究,建議你問Google大神看看。

Post a comment