我单位的应用系统是基于WEB服务(用的是JAVA)+浏览器,平常有很多重复的查询操作,为了提高效率,我用C#写了一个工具(VS2005下的Windows应用程序),利用WebBrowser控件设置网页上输入项的值,调用按钮元素对应的单击事件函数,实现自动查询与导出的目的。去年运行得不错,可是今年运行时竟然报“内在不能读”的错误。我用VS2008重新编译后还是报这个错。
具体报错语句已查到,请大伙帮分析下,问题产生的原因,有没有相应的解决方法?
用HtmlElemt eleBtn = Document.GetElementById("btn")取得网页元素没问题
但通过eleBtn调用单击事件函数是就会报“不能读取内存”的错误,我偿试了三种调用访求方式都是同一个错。
//方法1
eleBtn.RaiseEvent("OnClick");
//方法2
eleBtn.InvokeMember("click");
//方法3
document.InvokeScript("btn_onclick");

解决方案 »

  1.   

    在浏览器里正常吗? 这些是JS代码吧,好像没用到C#的方法啊?
      

  2.   

    你需要确定WEB服务是不是有更新了啊?如果更新了,可能你需要重新确认网友的源码是怎样修改的?
      

  3.   

    1、不用我的Windows程序,直接通过浏览使用应用系统,虽然有时会出现该错误(同样都是使用网页上的该按钮),但绝大部分时候可以正常运行
    2、我在程序中不用代码调用,直接用鼠标点击WebBrowser控件中显示的该网页的按钮也会出出内在不能读的错
    3、我利用WebBrowser提供的功能可以得到该页面的在本地的Html代码,显示网页上的该按钮元素对应的单击事件的定义没有大幅修改。
    得到的该按钮元素在网页中的定义如下
    <button id= btn onclick=btn_onclick()>导出</button>
    btn_onclick()函数并未直接出现在该网页的代码中,不过其<head></head>中有一段这样的定义
    <script language=javaScript src="js/button.js"></script>
    原来的btn_onclick()函数直接写在该网页代码中,不知是不是新的网页函数定义方式导致了目前的错误。
    对于这种可能由函数代码与网页代码相分离的方式引起的内存不能读的问题,是否可以通过对webBrowser进行某些属性的设置解决呢?
      

  4.   

    可能需要调用javascript
    http://www.cnblogs.com/xiaoshatian/archive/2008/09/02/1281786.html
      

  5.   

    非常感谢xingyuebuyu,我偿试你提供的代码,
    object script = doc2.Script //没问题
    在执行
    script.GetType().InvokeMember(...)时出现“调用的目标发生了异常”的错误
    在该句设置断点,查看了script的属性,发现其下_newEnum显示如下信息
    “((mshtml.HTMLWindow2Class)(script))._newEnum”引发了"System.NotImplementedException"类型的异常
    异常的Message为“尚未实现”。
    因此我想引起问题的关键问题不是什么元素获取的代码有问题,而是因为网页采用了执行代码与显示代码相分离的写法,导致了在Webbrowser中想调用对应的script函数时,程序找不到可以执行的代码。
    我尝试在程序只调用该页面不自动执行该按钮功能,然后用鼠标点击该按钮,也会产生该问题,但是在IE中一步步操作到点击该按钮的步骤,则可正常运行。
    所以我认为是WebBrowser控件本身的问题导致了该页面程序代码为及时实现,而在IE中则会及时实现与页面分离的程序代码。
    不知有人碰到WebBrowser控件的这个问题吗,有没有解决方案?