繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM