【问题标题】:Unable to get IDispatch from AccessibleObjectFromWindow无法从 AccessibleObjectFromWindow 获取 IDispatch
【发布时间】:2016-02-27 11:09:15
【问题描述】:

我正在使用以下方式获取MSWord的运行实例。

MSWord.Window wordWin = null;

uint OBJID_NATIVEOM = 0xFFFFFFF0;
Guid IID_IDispatch = new Guid("{00020400-0000-0000-C000-000000000046}");
Guid iid = IID_IDispatch;

Object accObject = null;

int hr = OleAcc.AccessibleObjectFromWindow(msWordHndl, OBJID_NATIVEOM, ref iid, ref accObject);

wordWin = accObject as MSWord.Window

if(wordWin != null) // <----(1)
{
   // do something.
}

这里的 msWordHndl 是 MS Word 句柄的有效运行实例。

上面的代码 (1) 在任何地方都可以正常工作,除了在我们的一些客户机器上。

我们需要做什么来确定为什么 msWordHndl 没有被识别为 MSWord COM 对象?即(1)总是失败。我们的机器/环境不会发生同样的情况。

以下已在客户机器上验证。

  1. Office 2010 plus 已安装
  2. 已安装主互操作组件 (PIA)。
  3. 已验证在安装 MS Office 时包含 .NET 可编程性支持。

更新:遇到Can Microsoft.office.interop.word.dll work without installing office?中提到的相同问题

但就我而言,Office 安装在客户计算机上。

我确实验证了 Microsoft.Office.Interop.Word.dll 位于 c:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Word\14.0.0...\ 我看到的一个小区别是 DLL 名称以“Policy.12.0”为前缀。为了确保这会导致任何问题,我检查了另一台 MSWord 访问正常但该计算机也具有与 DLL 相同的前缀的客户计算机。

【问题讨论】:

    标签: c# com ms-word automation office-interop


    【解决方案1】:

    这里的问题似乎是您传递给AccessibleObjectFromWindow 的句柄。您需要将句柄传递给实际的“可访问对象”,它是“_WwG”类的主 Word 窗口的子窗口。

    您将在此处找到如何执行此操作的示例代码:

    How to access Microsoft Word existing instance using late binding

    如果上面的示例不适合您,它有助于检查AccessibleObjectFromWindow 的返回值。

    【讨论】:

    • 您好,感谢您的快速回复。我们确实在传递子窗口的句柄。这在我们的环境中运行良好,但在客户上却不行,因此想知道客户机器上的 Office 安装或注册表项是否有任何问题。谢谢!
    • 如果您的代码失败,AccessibleObjectFromWindow 会返回什么?在您致电AccessibleObjectFromWindow 时,_WwG 句柄是否仍然有效?
    • 返回值为零,句柄仍然有效。我确实再次验证以确保。我遇到了与stackoverflow.com/questions/19576080/… 中提到的相同的问题,只是在生产计算机上安装了 msoffice
    • 可能是客户的“安装策略”使Microsoft.Office.Interop.Word.dll 无法访问?只是一个想法。如果确实如此,有没有办法确认并指向客户?这也将解除对客户的阻止。
    • 感谢@Dirk Vollmar 提供帮助。我解决了问题并作为答案发布。
    【解决方案2】:

    我刚刚解决了我的问题。问题是由于安装了多个版本的 MS Office,即安装 Office 13,然后降级到 Office 10。这在注册表中留下了两个键。

    http://help.turbolaw.com/hc/en-us/articles/200711886-Interop-error-when-creating-documents

    这有助于解决问题,即从注册表中手动删除不必要的键。

    【讨论】:

    • 我也得到了 E_FAIL (Unspecified error) 因为 Word 2013 和 2016 都已安装,所以我卸载了一个,这解决了我的问题,也感谢@Dirk Vollmar跨度>
    猜你喜欢
    • 1970-01-01
    • 2015-10-05
    • 2021-03-15
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多