我遇到了以下问题: 在我通过 COM 在我的 C++ 代码(Word、Excel、PowerPoint、Visio)中启动任何 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.
最佳答案
曾经有一篇关于这个的很好的知识库文章,但它消失了......本质是在 Bessie Zhao 的 MSDN 论坛上的一个答案中发布的,我将其复制到这里,以及我从知识库解释中记得的内容在它下面:
Have you tried the Workaround of KB 188546: http://support.microsoft.com/kb/188546/EN-US/? It introduces a way as below. Before you create your Word object, first create a temporary Word object. After you create your object, close the temporary object. This causes Word to act properly when you control it through Automation (that is, if a user interactively starts Word, a new instance of Word is opened for the user). The automation instance remains hidden and separate. Code like this,
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 中,然后摧毁第一个。此时,ROT 中没有 Office 应用程序的实例,因此当用户调用它时,在 ROT 中找不到任何内容时,Office 应用程序会创建一个新的自身实例,独立于软件使用的实例。
关于c# - 防止用户附加到 MS-Office 进程的开发人员运行实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54324083/