[英]How to start new word instance without add-ins when word is already started
我正在使用Word(從2007年到2013年)將文檔轉換為PDFA格式,但是遇到具有某些加載項的用戶時遇到了麻煩。 當他們使用系統時,會得到各種COM異常,例如RPC_E_SERVERCALL_RETRYLATER和(0x800706BA)RPC服務器不可用。
如果他們禁用外接程序,則可以正常工作。 問題是需要外接程序,這樣簡單的解決方案便無法實現。 (我也知道,用單詞來表達這種東西是不被接受的,我們正在尋求更好的東西,但是直到業務方面想付錢之前,我們都被這個問題困住了。)
新計划是使用/ a參數開頭word,以使其在沒有加載項的情況下開始。
我看到了另一個問題, 如何在沒有外接程序的情況下從.NET啟動MS Office Word? 如果有一個Word實例的可行解決方案,
//startup without plugins
System.Diagnostics.Process.Start(
@"Winword.exe",
@"/a");
//give a time for startup
Thread.Sleep(2000);
//attach to office
Application officeApplication = (Application)Marshal.GetActiveObject("Word.Application");
我的問題有兩點:啟動這樣的單詞時是否可以設置啟動參數
var _word = new Word.Application();
因此,我不必使用Process.start();。
如果不是,我該如何后期綁定到特定的單詞實例(GetActiveObject(),始終獲取最早的單詞實例),也許還有其他方法?
對於第一個問題,沒有辦法傳遞參數或以其他方式影響使用new
關鍵字時Word的啟動方式。 啟動應用程序的說明位於注冊表中,因此它將涉及更改在注冊表中實現new
關鍵字的方式。 並且由於此注冊表項還確定Windows資源管理器如何啟動Word.Application,因此更改注冊表項也將更改Word為用戶工作的方式。
通過Application.COMAddins
屬性啟動Word實例后,可以卸載加載項。 這等效於在Word UI中取消選中“ COM加載項”對話框中“加載項”旁邊的框。 我將測試在UI中執行此操作是否允許您的軟件正常工作。
如果是這樣,您可以將其合並到您的代碼中-無需擔心在沒有加載項的情況下啟動Word。
這就GetActiveObject
了第二個問題: GetActiveObject
僅能訪問在ROT中注冊的Word(任何Office應用程序)的單個實例。 根據設計,Office應用程序僅在ROT中注冊一個實例,通常,這將是第一個實例。 MSDN上有一些知識庫文章對此進行了描述。 唯一的解決方法是在用戶配置文件中啟動Word的兩個實例,“隱藏”第一個(已注冊的)實例,然后將第二個實例呈現給用戶。
但這可能很棘手,因此,如果可行,我會建議使用COMAddins集合來卸載有問題的加載項。
(我目前在移動設備上。下次,在我的主機上,我將嘗試記住粘貼指向ROT上KB文章的鏈接。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.