首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止用户附加到MS-Office process的开发人员运行实例

防止用户附加到MS-Office process的开发人员运行实例
EN

Stack Overflow用户
提问于 2019-01-23 17:35:35
回答 2查看 110关注 0票数 3

我遇到了以下问题:在我通过COM在我的C++代码(Word、Excel、PowerPoint、Visio)中启动任何Ms-Office应用程序并将其隐藏后-然后如果用户启动自己的应用程序-它将附加到按我的代码运行的office进程,而我不知道这一点。最终,在我的代码执行后,我关闭了Office应用程序,用户将丢失其工作(只要他们附加到我的进程,并且没有启动自己的进程)。

所以,

1)有没有办法防止用户附加到我的Office应用程序实例并启动自己的进程?也许是CoCreateInstance的一个参数,或者其他什么?

2)或(另一个选项)-如何检测用户刚刚附加到run-by-me办公流程?

都会感谢任何帮助。

下面是关于如何创建Office应用程序的一段代码

代码语言:javascript
复制
CComPtr<IDispatch> pOffApp;
hr = pOfficeApp.CoCreateInstance(L"Word.Application", NULL, CLSCTX_LOCAL_SERVER); //may also be "Excel.Application", "Visio.Application" etc.
EN

回答 2

Stack Overflow用户

发布于 2019-01-23 19:29:20

以前有一篇很好的知识库文章,但现在已经消失了……这个要点是在MSDN论坛上由贝西·赵发布的答案中发布的,我在这里复制了这个答案,并从下面的KB解释中记得:

您是否尝试过KB 188546:http://support.microsoft.com/kb/188546/EN-US/的变通方法?它介绍了一种如下方法。在创建Word对象之前,请先创建一个临时Word对象。创建对象后,关闭临时对象。这会使Word在您通过自动化对其进行控制时正常工作(即,如果用户以交互方式启动Word,则会为用户打开一个新的Word实例)。自动化实例保持隐藏和分离状态。像这样的代码,

object missing = Type.Missing;Word.Application temp = new Word.Application();Word.Application wordApp = new Word.Application();wordApp.Visible = true;temp.Quit(ref missing,ref missing,ref missing);temp = null;...

原因是Office应用程序如何使用ROT (运行对象表)。在ROT中只会出现Office应用程序的一个实例-启动的第一个实例。

如果Office以外的其他应用程序创建了该应用程序的实例,则该应用程序就是处于ROT中的应用程序。Office设计为在ROT中查找正在运行的实例,如果存在,则在用户启动应用程序或打开文档时使用该实例。这就是为什么问题中描述的情况是可能的。

解决方法基本上是:创建两个实例。使用第二个,它不会腐烂,然后销毁第一个。此时,Office应用程序的任何实例都不在ROT中,因此当用户调用它时,如果在ROT中找不到任何内容,Office应用程序将创建其自身的一个新实例,独立于软件所使用的实例。

票数 1
EN

Stack Overflow用户

发布于 2019-01-23 17:43:54

获取Application对象。检查Application.Visible属性。如果应用程序可见,则不应退出该应用程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54324083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档