当word已经启动时,如何在没有加载项的情况下启动新的单词实例

时间:2016-05-07 07:20:04

标签: c# office-interop com-interop

我使用Word(2007年至2013年)将文档转换为PDFA格式, 并且我遇到了使用某些加载项的用户的问题。当他们使用系统时,他们会得到各种各样的COM异常,例如RPC_E_SERVERCALL_RETRYLATER和(0x800706BA)RPC服务器不可用。

如果他们禁用加载项,它可以正常工作。问题是加载项是必需的,因此简单的解决方案就在窗外。 (我也知道,对于这种事情使用词语是不受欢迎的,我们正在寻求更好的东西,但在业务方面想要付出代价之前,我们仍然坚持这一点)

新计划是使用/ a参数启动单词,使其在没有加载项的情况下启动。

我看到了另一个问题How can I start MS Office Word from .NET without Add-ins? 如果有一个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(),总是得到最老的单词实例),也许还有其他一些方法?

1 个答案:

答案 0 :(得分:0)

对于您的第一个问题,在使用new关键字时,无法传递参数或以其他方式影响Word的启动方式。启动应用程序的说明在注册表中,因此它涉及更改new关键字在注册表中的实现方式。由于此注册表项还确定了Windows资源管理器如何启动Word.Application,因此更改注册表项也会更改Word为用户工作的方式。

通过Application.COMAddins属性启动Word实例后,可以卸载加载项。这相当于取消选中Word UI中COM加载项对话框中的加载项条目旁边的框。我会测试在UI中执行此操作是否允许您的软件正常工作。

如果是,您可以将其合并到您的代码中 - 无需担心在没有加载项的情况下启动Word。

这引出了第二个问题:GetActiveObject只能访问在ROT中注册的Word(任何Office应用程序)的单个实例。按照设计,Office应用程序只在ROT中注册一个实例,通常,这将是第一个实例。 MSDN上有几篇KB文章描述了这一点。唯一的解决方法是在用户配置文件中启动两个 Word实例,"隐藏"第一个(注册的)并将第二个呈现给用户。

但这可能很棘手,所以如果它有效,我会继续关于COMAddins集合的建议来卸载问题插件。

(我目前正在使用移动设备。下次我在主设备上时,我会尝试记住在ROT上粘贴知识库文章的链接。)