从子进程访问 Excel VSTO COM Addin控制台应用程序

问题描述

我想要做的是能够从我的 VSTO COMAddin 启动一个子进程(具有提升的权限),该子进程可以访问生成它的进程的 COMAddin 对象。

更具体地说,我希望能够杀死插件(通过 COMAddin.Connect = false),完成需要权限的工作,然后重新启动插件

使用第二个插件我可以完成这个,因为我可以访问 Application.COMAddIns 集合(第二个插件会在需要时关闭一个插件,启动特权进程并在第一个插件完成后重新启动)。如果可能的话,我宁愿没有 2 个单独的插件来完成此任务。

我也知道我可以使用 new Excel.Application() 启动一个新的 Excel 实例并从那里访问 COMAddIns,但是我不想要一个新实例,我希望能够控制来自正在运行的实例的插件

感谢任何帮助/想法。

解决方法

您可以使用 GetActiveObject 函数从外部应用程序获取 Excel 运行实例,该函数使用运行对象表 (ROT) 获取活动 Excel 实例,并为您提供最后打开的 Excel 实例 -不一定是与您拥有的窗口句柄对应的那个。

public Excel.Application StartExcel()
{
    Excel.Application instance = null;
    try
    {
       instance = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    }
    catch (System.Runtime.InteropServices.COMException ex)
    {
       instance = new Excel.ApplicationClass();
    }

    return instance;
}

您可能还会发现 AccessibleObjectFromWindow 函数很有用,它为与指定窗口关联的对象检索指定接口的地址。有关详细信息,请参阅 How to use use late binding to get excel instance?


请注意,您可以从其他应用程序访问您的加载项方法和属性。在 Call code in VSTO Add-ins from other Office solutions 文章中阅读更多相关信息。