无法从AccessibleObjectFromWindow

时间:2015-11-24 20:35:56

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

我使用以下方式获取正在运行的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可编程性支持。
  4. 更新:遇到与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名称以&#34; Policy.12.0&#34;为前缀。为了确保这会导致任何问题,我检查了另一台客户端计算机,其中MSWord访问正常,但该计算机也具有相同的DLL前缀。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

您可以在此处找到示例代码:

<强> How to access Microsoft Word existing instance using late binding

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