繁体   English   中英

阻止用户附加到MS-Office进程的run-by-developer实例

[英]Prevent user from attaching to run-by-developer instance of MS-Office process

我遇到以下问题:在我的C ++代码(Word,Excel,PowerPoint,Visio)中通过COM启动任何Ms-Office应用程序并将其隐藏后 - 如果用户启动自己的该应用程序的内容 - 它将附加到运行我的代码办公室流程,虽然我不知道。 在我的代码执行完毕后,我关闭Office应用程序并且用户将丢失其工作(就他们附加到我的进程并且没有启动它自己的工作而言)

所以,

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

2)或(另一种选择) - 如何检测用户刚刚附加到我的办公流程?

将不胜感激任何帮助。

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

CComPtr<IDispatch> pOffApp;
hr = pOfficeApp.CoCreateInstance(L"Word.Application", NULL, CLSCTX_LOCAL_SERVER); //may also be "Excel.Application", "Visio.Application" etc.

曾经有过一篇很好的知识库文章,但它已经消失了......本质上是在MSDN论坛的答案中发布的,我在这里复制了Bessie Zhao,我记得下面的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中正在运行的实例,如果存在,则在用户启动应用程序或打开文档时使用该实例。 这就是为什么问题中描述的情况是可能的。

解决方法基本上说:创建两个实例。 使用第二个,它不会在ROT中,然后销毁第一个。 此时,Office应用程序的任何实例都不在ROT中,因此当用户调用它时,在ROT中找不到任何内容时,Office应用程序会创建自己的新实例,而不依赖于软件使用的实例。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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