Mik*_*fer 1 .net internet-explorer activex
我们有一个ActiveX组件,它通过SHDocVw在Internet Explorer窗口中显示一个Web页面.在DocumentComplete事件处理程序中,我们尝试从页面上的一个控件中检索值.我们知道控件在页面上(通过Fiddler跟踪可见).
在这一点上,事情变得不稳定.我们在运行时收到以下错误消息:
Error Message:
Public member 'elements' on type 'DBNull' not found.
Error Routine Location:
at Microsoft.VisualBasic.CompilerServices.Symbols.Container.GetMembers(String& MemberName, Boolean ReportErrors)
at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack)
at Foo.AddinModule.m_internetExplorer_DownloadComplete(Object pDisp, Object& url)
Error Source:
Microsoft.VisualBasic
Error Site Location:
System.Reflection.MemberInfo[] GetMembers(System.String ByRef, Boolean)
Run Code Online (Sandbox Code Playgroud)
令人讨厌的代码行是这样的:
Me.IEInstance.Document.forms("frmRedirect").elements("redirectData").Value = outlookXML.OuterXml
Run Code Online (Sandbox Code Playgroud)
所以,基本上,Me.IEInstance.Document.forms("frmRedirect")
正在评估DBNull
.
我们已经消除了区分大小写的问题.尝试在页面内移动控件,并验证HTML格式正确.我不知道为什么会这样.下面是生成的HTML的示例.
任何人都可以提出这个问题的原因和可能的解决方案吗?我现在正在接受任何和所有的建议.
HTML示例
<form id='frmRedirect' name='frmRedirect' action='pw_outlook/choosecontacts.aspx' method='POST'>
<input type='hidden' name='redirectData'>
</form>
Run Code Online (Sandbox Code Playgroud)
更新2012年3月28日
我们已经确定代码在某些配置下工作正常.然后,神秘的是,如果您更改代码,它将成功为一些用户,如下所示:
Me.IEInstance.Document.forms("frmRedirect").Elements("redirectData").Value = outlookXML.OuterXml
^
^
Run Code Online (Sandbox Code Playgroud)
也就是说,如果你只是改变一下的情况Elements
.对我而言,在COM vtable查找过程中,这个问题很明显,但神秘之处在于并不是每个人都会遇到这种问题.只是一些用户.
另请注意,返回的表单.forms("frmRedirect")
是有效对象; 但是,似乎没有elements()
方法.
您正在与DLR中的错误作斗争,DLR是在.NET 4中添加的动态语言运行库.堆栈跟踪上的代码与DLR的VB.NET绑定程序相关.这个错误几乎肯定不是由您发布的代码触发的,很可能是您项目中的某些其他代码使用dbase查询执行某些操作.鉴于异常消息中存在DBNull.
您需要Microsoft的支持才能深入了解这一点.他们需要你的项目给他们一个repro来工作,因为代码片段本身不会帮助他们找到它.您可以与Microsoft支持部门联系以启动它.他们会从你的信用卡中取出一大块,但你几乎肯定会把它拿回来,因为它可能是他们代码中的错误,而不是你的.
虽然并不能确保DLR损坏不会在以后引起某种问题,但是可能有针对此特定故障的解决方法.通过编写早期绑定代码,您可以在不使用DLR的情况下编写完全相同的代码.从Project + Add Reference,Browse选项卡开始,选择c:\ windows\system32\mshtml.tlb
然后重写您的代码段,如下所示:
Dim doc = DirectCast(Me.IEInstance.ActiveXInstance, mshtml.IHTMLDocument2)
Dim form = DirectCast(doc.forms("frmRedirect"), mshtml.IHTMLFormElement)
If form IsNot Nothing Then
Dim elem = DirectCast(form.elements("redirectData"), mshtml.IHTMLInputElement)
If elem IsNot Nothing Then
elem.value = outlookXML.OuterXml
End If
End If
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3995 次 |
最近记录: |