我使用以下方法获取正在运行的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)总是失败。在我们的机器/环境中也不会发生同样的事情。
以下内容已在客户机器上得到验证。
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相同。
发布于 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
这有助于解决这个问题,即从注册表中手动删除不必要的键。
发布于 2015-11-25 14:23:23
这里的问题似乎是您要传递给AccessibleObjectFromWindow的句柄。您需要向实际的“可访问对象”传递一个句柄,该对象是类"_WwG“的主单词窗口的子窗口。
您将在这里找到示例代码--如何做到这一点:
How to access Microsoft Word existing instance using late binding
如果上面的示例不适用于您,则有助于检查AccessibleObjectFromWindow的返回值。
https://stackoverflow.com/questions/33903323
复制相似问题