none
API事件中访问webBrowser1.Document的问题 RRS feed

  • 问题

  • 调用了 rasapi32.dll 中的 RasDial方法,在该方法的事件处理中,如果调用了webBrowser1.Document,会出现一个奇怪的错误:

    当从一个数字执行强制转换时,值必须出现是一个小于无限大的数字。

    貌似是webBrowser控件的Bug。

    后来直接使用Flash控件,不通过webBrowser中转,问题解决。


    www.fengyun.org
    2011年1月17日 9:48

全部回复

  • 是否可以提供一些相关的代码? 有助于我们去重现这个问题.


    Eric Yang [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年1月18日 13:24
  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace Org.FengYun.Demo
    {
    	[ComVisible(true)]
    	public partial class WebForm : Form
    	{
    		RasDialClass ras = new RasDialClass();
    
    		public WebForm()
    		{
    			Control.CheckForIllegalCrossThreadCalls = false;
    			InitializeComponent();
    			ras.OnDialCallback += new RasDialClass.RasDialCallbackEvent(ras_OnDialCallback);
    			webBrowser1.Document.Write("<html><body>Hello World</body></html>");
    			webBrowser1.ObjectForScripting = this;
    		}
    
    		void ras_OnDialCallback(uint untMsg, int intState, int intErr)
    		{
    			var doc = webBrowser1.Document;	// <============ 此行出错
    		}
    
    		#region 发送拨号请求
    		public void dial()
    		{
    			ras.Connect("RasDial", "Guest", "");
    		}
    		#endregion
    	}
    
    	class RasDialClass
    	{
    		#region 基本变量定义
    		IntPtr Handler = IntPtr.Zero;
    		public delegate void RasDialCallbackEvent(uint untMsg, int intState, int intErr);
    		/// 拨号状态返回事件
    		public event RasDialCallbackEvent OnDialCallback;
    		/// 是否已经连接
    		public bool HasConnected { get; set; }
    		#endregion
    
    		#region 拨号构造函数
    		public RasDialClass()
    		{
    			OnDialCallback += new RasDialCallbackEvent(RasDialClass_OnDialCallback);
    		}
    		#endregion
    
    		#region 内置拨号事件
    		void RasDialClass_OnDialCallback(uint untMsg, int intState, int intErr)
    		{
    			if (intState == 8192) HasConnected = true;
    			if (intErr > 0) Disconnect();
    		}
    		#endregion
    
    		#region 提供信息拨号
    		/// 拨号
    		/// <param name="strDial" />拨号名称,如果是电话号码,请以“:”开头
    		/// <param name="strUser" />用户名
    		/// <param name="strPass" />密码
    		/// 返回拨号状态
    		public int Connect(string strDial, string strUser, string strPass)
    		{
    			var rasPar = new RasDialParams();
    			rasPar.dwSize = Marshal.SizeOf(rasPar);
    			if (!strDial.StartsWith(":")) rasPar.szEntryName = strDial + "\0";
    			else rasPar.szPhoneNumber = strDial.Replace(":", "") + "\0";
    			rasPar.szUserName = strUser + "\0";
    			rasPar.szPassword = strPass + "\0";
    			var rs = RasDial(0, null, ref rasPar, 0, OnDialCallback, ref Handler);
    			if (rs > 0) Handler = IntPtr.Zero;
    			return rs;
    		}
    		#endregion
    
    		#region 断开拨号连接
    		/// 断开拨号连接
    		public void Disconnect()
    		{
    			RasHangUp(Handler);
    			Handler = IntPtr.Zero;
    			HasConnected = false;
    		}
    		#endregion
    
    		#region 构建拨号参数
    		struct RasDialParams
    		{
    			public int dwSize;
    			[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
    			public string szEntryName;
    			[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)]
    			public string szPhoneNumber;
    			[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)]
    			public string szCallbackNumber;
    			[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
    			public string szUserName;
    			[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
    			public string szPassword;
    			[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    			public string szDomain;
    			public int dwSubEntry;
    			public int dwCallbackId;
    		}
    		#endregion
    
    		#region 引用拨号方法
    		[DllImport("RasApi32.dll")]
    		static extern int RasDial(
    			int intRDE,
    			string strBook,
    			ref RasDialParams rdpParam,
    			int intNT,
    			RasDialCallbackEvent evt,
    			ref IntPtr intHandler
    		);
    		#endregion
    
    		#region 引用断开连接
    		[DllImport("RasApi32.dll")]
    		static extern uint RasHangUp(IntPtr rasConn);
    		#endregion
    	}
    
    }
    

    www.fengyun.org
    2011年1月20日 8:04
  • 触发dial(),拨打一个计算机存在的拨号名称,才会出现错误。
    www.fengyun.org
    2011年1月20日 8:09
  •  

    非常感谢你能提供如此详细的代码,但是由于我这边无法拨号,所以没有重现你所说的问题.建议你把这个issue提交到http://connect.microsoft.com,微软的工作人员会仔细分析你所提出的问题.


    Eric Yang [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年1月24日 14:14
  • 关于拨号,我也是在本机搭建vpn来测试的。Windows XP以上的系统均可搭建VPN。


    www.fengyun.org
    2011年1月25日 8:33