首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从IDispatch获得AccessibleObjectFromWindow

无法从IDispatch获得AccessibleObjectFromWindow
EN

Stack Overflow用户
提问于 2015-11-24 20:35:56
回答 2查看 703关注 0票数 0

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

代码语言:javascript
复制
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 +已安装
  2. 已安装主互操作程序集(PIA)。
  3. 在安装MS时验证是否包括.NET可编程性支持。

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

但在我的例子中,Office安装在客户计算机上。

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

EN

回答 2

Stack Overflow用户

发布于 2015-11-25 20:35:41

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-11-25 14:23:23

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

您将在这里找到示例代码--如何做到这一点:

How to access Microsoft Word existing instance using late binding

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33903323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档