无法从AccessibleObjectFromWindow获取IDispatch

本文关键字:获取 IDispatch AccessibleObjectFromWindow | 更新日期: 2023-09-27 18:24:06

我正在使用以下方式获取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没有被识别为MSWordCOM对象?即(1)总是失败。同样的情况不会发生在我们的机器/环境上。

以下内容已在客户机器上进行了验证。

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

更新:遇到与中提到的问题相同的问题。Microsoft.office.interop.word.dll在不安装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前缀也相同。

无法从AccessibleObjectFromWindow获取IDispatch

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

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

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

这里的问题似乎是传递给AccessibleObjectFromWindow的句柄。您需要向实际的"可访问对象"传递一个句柄,该对象是类"_WwG"的主Word窗口的子窗口。

你可以在这里找到如何做到这一点的示例代码:

如何使用后期绑定访问Microsoft Word现有实例

如果上面的示例对您不起作用,它将有助于检查AccessibleObjectFromWindow的返回值。