0

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

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

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

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

任何帮助/想法表示赞赏。

4

1 回答 1

0

您可以使用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函数很有帮助,它检索与指定窗口关联的对象的指定接口的地址。请参阅如何使用后期绑定获取 excel 实例?了解更多信息。


请注意,您可以从其他应用程序访问您的加载项方法和属性。在来自其他 Office 解决方案的 VSTO 加载项中的调用代码一文中阅读有关此内容的更多信息。

于 2021-04-27T18:32:28.450 回答