如何在另一个上下文中的进程上调用GetActiveObject?

时间:2015-07-23 08:32:40

标签: c# .net powershell com

注意:虽然我的示例代码在Powershell中,但我可以轻松地将C#示例转换为Powershell。我相信C#开发人员更有可能遇到这个问题,即使我使用Powershell尝试这样做。

我正在尝试调试服务器端Word自动化的问题。我知道您并不打算将它用于服务器应用程序,我们正在更改应用程序,因此它不会这样做但是在此之前我需要一种可靠的方法来调试它挂起的问题因为它是随机的。

我不能在Word对象上切换.Visible = True,因为它不会一直失败。我只是需要一种方法来反复检索它。

如果我启动Word并执行此脚本,它可以工作:

$w = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Word.Application")
$w.Visible = $false;
Start-Sleep -Seconds 5
$w.Visible = $true;

但是,如果Word的挂起副本开始由COM +进程调用,则会发生以下异常:

  

异常调用" GetActiveObject"用" 1"参数:"操作不可用(HRESULT异常:0x800401E3(MK_E_UNAVAILABLE))"

Powershell和COM +进程在同一个用户下运行,在任务管理器中,它们都显示为在同一用户下运行。

我尝试运行Powershell,因为所有提升/非提升和x86 / x64模式的组合都无济于事。

因此,我假设该流程位于我无法从我的Powershell会话中访问的另一个上下文或区域。

所以我的问题之一是:

  1. 如何在COM +流程中启动Powershell流程?
  2. 如何切换上下文以便我可以访问此对象实例?
  3. 有没有其他方法可以尝试检索此隐藏窗口并将其设置为可见?
  4. 不幸的是,似乎围绕这一主题的大多数问题最终都会有人说“嗯,不要那么做”#34;。遗憾的是,我们现在没有选择重新开发系统的这一重要部分,我希望能够为我们这些不时处理这些遗留系统的人提供这些文件。

0 个答案:

没有答案