gpt4 book ai didi

c# - 防止用户附加到 MS-Office 进程的开发人员运行实例

转载 作者:太空狗 更新时间:2023-10-29 22:54:45 26 4
gpt4 key购买 nike

我遇到了以下问题:在我通过 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com