Vb.net IOLEWindow接口不工作(不再?)

Vb.net IOLEWindow接口不工作(不再?),vb.net,.net-4.5,Vb.net,.net 4.5,我们在应用程序中使用这段代码已有很长时间了,据我们所知,到目前为止,它运行良好: (请注意,我已经删除了与问题无关的任何代码,例如,在我的实际代码中,接口还包含ContextSensitiveHelp的定义,并且方法的顺序正确) 这似乎不再有效。调用此行后,变量oFoo仍然是“Nothing”,因此它无法建立传入的原始对象的窗口句柄 如果有关系:项目的目标框架是.NET framework 4.5.2,原始对象是Microsoft.Office.Interop.Word.Window。该项目引用

我们在应用程序中使用这段代码已有很长时间了,据我们所知,到目前为止,它运行良好:

(请注意,我已经删除了与问题无关的任何代码,例如,在我的实际代码中,接口还包含ContextSensitiveHelp的定义,并且方法的顺序正确)

这似乎不再有效。调用此行后,变量oFoo仍然是“Nothing”,因此它无法建立传入的原始对象的窗口句柄

如果有关系:项目的目标框架是.NET framework 4.5.2,原始对象是Microsoft.Office.Interop.Word.Window。该项目引用了Microsoft.Office.Interop.Word 14.0.0.0。该应用程序是为x86编译的

有人能解释为什么这不再有效吗?

当上述操作失败时,我们可以通过添加以下代码来获取窗口句柄,从而绕过该问题:

Try
    hWnd = New IntPtr(CLng(oOriginal.Hwnd))
Catch
    hWnd = IntPtr.Zero
End Try
If hWnd = IntPtr.Zero Then
    Try
        hWnd = oOriginal.Handle
    Catch

    End Try
End If

但是我认为这是一种“希望和希望”的方法,这对我来说并不合适。因此,如果有人能告诉我原始代码有什么问题,以及如何改进它而不必求助于后一种方法,那就太好了。

与此同时,我一直在四处搜索,我发现了一个问题:请注意Eugene Astafiev添加的评论和回复。当我从冒犯性的语句中删除TryCast时,它一开始似乎起了作用。oFoo看起来是一个IOleWindow而不是“Nothing”-但是当我尝试调用GetWindow时,我得到了与用户1523271在其回复中提到的相同的0x80004002错误。。。因此,任何帮助都将不胜感激:(由于到目前为止这一切都很正常,我想知道这是否是..TnTinMn的另一个副产品,我不会感到惊讶。Jimi-据我所知,这正是我声明它的方式,尽管是用VB.NET语法。还是我遗漏了什么?嗨Jimi-好的,我在我的机器上的几个地方找到了Microsoft.VisualStudio.OLE.Interop.dll。拿了一个与我的cu匹配的当前的Visual Studio,在我的项目中添加了对它的引用,并尝试了:oFoo=TryCast(oFoo,Microsoft.VisualStudio.OLE.Interop.IOleWindow)也不起作用。就像我自己的代码一样,它留给oFoo的代码什么都不是。
oFoo = TryCast(oOriginal, IOleWindow)
Try
    hWnd = New IntPtr(CLng(oOriginal.Hwnd))
Catch
    hWnd = IntPtr.Zero
End Try
If hWnd = IntPtr.Zero Then
    Try
        hWnd = oOriginal.Handle
    Catch

    End Try
End If