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

标签 c# c++ vba com ms-office

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

相关文章:

vba - powerpoint vba 文本效果调整 handle

excel - 根据记录过滤excel工作表形成第二张表

c# - Service Fabric 可靠集合 : serialization issue

c# - ASP.NET MVC Controller 单元测试失败

c# - Crystal 报表在十进制字段中显示######

javascript - 我想知道如何在不通过 chrome 打印弹出窗口的情况下与网络中的打印机通信

c++ - 如何将 std::string 转换为 WCHAR

c++ - openCV 中的彩色对象跟踪不断检测皮肤

c++ - 如何将 XML 文件拆分为多个 XML,以便每个新文件仅包含原始文件中的一个文本节点?

vba - 将 Excel 连接到 Access - VBA