无法从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)总是失败。同样的情况不会发生在我们的机器/环境上。
以下内容已在客户机器上进行了验证。
- 已安装Office 2010 plus
- 主互操作程序集(PIA)已安装
- 已验证在安装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前缀也相同。
我刚刚解决了我的问题。该问题是由于安装了多个版本的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
的返回值。