我使用以下方式获取正在运行的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)总是失败。在我们的机器/环境中也不会发生同样的情况。
以下内容已在客户机器上得到验证。
更新:遇到与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前缀。
答案 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
的返回值。