此程序可以实现系统拨号找到系统的拨号设置,然后再拨号成功后,显示拨号状态,非原创,用C#移植了一下,原文参见CodeProject中关于Web 实现拨号的文章。
下面是拨号需要用到的文件,一个RAS自定义类,添加到工程文件中就可用,C#的
下面是引用这个代码的实例,加入一个comboBox来显示拨号的设置,用两个button来控制连接状态,用八个label来显示连接后的状态信息,希望对大家有用处。原Web程序参见CodeProject中的文章
下面是拨号需要用到的文件,一个RAS自定义类,添加到工程文件中就可用,C#的
代码:
//////////////////// using System; using System.Runtime.InteropServices; using System.Text; namespace Dialup.RAS { public enum RasFieldSizeConstants { RAS_MaxDeviceType = 16, RAS_MaxPhoneNumber = 128, RAS_MaxIpAddress = 15, RAS_MaxIpxAddress = 21, #if WINVER4 RAS_MaxEntryName =256, RAS_MaxDeviceName =128, RAS_MaxCallbackNumber =RAS_MaxPhoneNumber, #else RAS_MaxEntryName = 20, RAS_MaxDeviceName = 32, RAS_MaxCallbackNumber = 48, #endif RAS_MaxAreaCode = 10, RAS_MaxPadType = 32, RAS_MaxX25Address = 200, RAS_MaxFacilities = 200, RAS_MaxUserData = 200, RAS_MaxReplyMessage = 1024, RAS_MaxDnsSuffix = 256, UNLEN = 256, PWLEN = 256, DNLEN = 15 } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct GUID { public uint Data1; public ushort Data2; public ushort Data3; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[] Data4; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct RASCONN { public int dwSize; public IntPtr hrasconn; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)RasFieldSizeConstants.RAS_MaxEntryName + 1)] public string szEntryName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)RasFieldSizeConstants.RAS_MaxDeviceType + 1)] public string szDeviceType; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)RasFieldSizeConstants.RAS_MaxDeviceName + 1)] public string szDeviceName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]//MAX_PAPTH=260 public string szPhonebook; public int dwSubEntry; public GUID guidEntry; #if (WINVER501) int dwFlags; public LUID luid; #endif } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct LUID { int LowPart; int HighPart; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct RasEntryName { public int dwSize; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = (int)RasFieldSizeConstants.RAS_MaxEntryName + 1)] public string szEntryName; #if WINVER5 public int dwFlags; [MarshalAs(UnmanagedType.ByValTStr,SizeConst=260+1)] public string szPhonebookPath; #endif } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public class RasStats { public int dwSize = Marshal.SizeOf(typeof(RasStats)); public int dwBytesXmited; public int dwBytesRcved; public int dwFramesXmited; public int dwFramesRcved; public int dwCrcErr; public int dwTimeoutErr; public int dwAlignmentErr; public int dwHardwareOverrunErr; public int dwFramingErr; public int dwBufferOverrunErr; public int dwCompressionRatioIn; public int dwCompressionRatioOut; public int dwBps; public int dwConnectDuration; } public class RAS { [DllImport("Rasapi32.dll", EntryPoint = "RasEnumConnectionsA", SetLastError = true)] public static extern int RasEnumConnections ( ref RASCONN lprasconn, // buffer to receive connections data ref int lpcb, // size in bytes of buffer ref int lpcConnections // number of connections written to buffer ); [DllImport("rasapi32.dll", CharSet = CharSet.Auto)] public static extern uint RasGetConnectionStatistics( IntPtr hRasConn, // handle to the connection [In, Out]RasStats lpStatistics // buffer to receive statistics ); [DllImport("rasapi32.dll", CharSet = CharSet.Auto)] public extern static uint RasHangUp( IntPtr hrasconn // handle to the RAS connection to hang up ); [DllImport("rasapi32.dll", CharSet = CharSet.Auto)] public extern static uint RasEnumEntries( string reserved, // reserved, must be NULL string lpszPhonebook, // pointer to full path and // file name of phone-book file [In, Out]RasEntryName[] lprasentryname, // buffer to receive // phone-book entries ref int lpcb, // size in bytes of buffer out int lpcEntries // number of entries written // to buffer ); [DllImport("wininet.dll", CharSet = CharSet.Auto)] public extern static int InternetDial( IntPtr hwnd, [In]string lpszConnectoid, uint dwFlags, ref int lpdwConnection, uint dwReserved ); public RAS() { } } public class RASDisplay { private string m_duration; private string m_ConnectionName; private string[] m_ConnectionNames; private double m_TX; private double m_RX; private bool m_connected; private IntPtr m_ConnectedRasHandle; public RASDisplay() { m_connected = true; RAS lpras = new RAS(); RASCONN lprasConn = new RASCONN(); lprasConn.dwSize = Marshal.SizeOf(typeof(RASCONN)); lprasConn.hrasconn = IntPtr.Zero; int lpcb = 0; int lpcConnections = 0; int nRet = 0; lpcb = Marshal.SizeOf(typeof(RASCONN)); nRet = RAS.RasEnumConnections(ref lprasConn, ref lpcb, ref lpcConnections); if (nRet != 0) { m_connected = false; return; } if (lpcConnections > 0) { RasStats stats = new RasStats(); m_ConnectedRasHandle = lprasConn.hrasconn; RAS.RasGetConnectionStatistics(lprasConn.hrasconn, stats); m_ConnectionName = lprasConn.szEntryName; int Hours = 0; int Minutes = 0; int Seconds = 0; Hours = ((stats.dwConnectDuration / 1000) / 3600); Minutes = ((stats.dwConnectDuration / 1000) / 60) - (Hours * 60); Seconds = ((stats.dwConnectDuration / 1000)) - (Minutes * 60) - (Hours * 3600); m_duration = Hours + " hours " + Minutes + " minutes " + Seconds + " secs"; m_TX = stats.dwBytesXmited; m_RX = stats.dwBytesRcved; } else { m_connected = false; } int lpNames = 1; int entryNameSize = 0; int lpSize = 0; RasEntryName[] names = null; entryNameSize = Marshal.SizeOf(typeof(RasEntryName)); lpSize = lpNames * entryNameSize; names = new RasEntryName[lpNames]; names[0].dwSize = entryNameSize; uint retval = RAS.RasEnumEntries(null, null, names, ref lpSize, out lpNames); //if we have more than one connection, we need to do it again if (lpNames > 1) { names = new RasEntryName[lpNames]; for (int i = 0; i < names.Length; i++) { names[i].dwSize = entryNameSize; } retval = RAS.RasEnumEntries(null, null, names, ref lpSize, out lpNames); } m_ConnectionNames = new string[names.Length]; if (lpNames > 0) { for (int i = 0; i < names.Length; i++) { m_ConnectionNames[i] = names[i].szEntryName; } } } public string Duration { get { return m_connected ? m_duration : ""; } } public string[] Connections { get { return m_ConnectionNames; } } public double BytesTransmitted { get { return m_connected ? m_TX : 0; } } public double BytesReceived { get { return m_connected ? m_RX : 0; } } public string ConnectionName { get { return m_connected ? m_ConnectionName : ""; } } public bool IsConnected { get { return m_connected; } } public int Connect(string Connection) { int temp = 0; uint INTERNET_AUTO_DIAL_UNATTENDED = 2; int retVal = RAS.InternetDial(IntPtr.Zero, Connection, INTERNET_AUTO_DIAL_UNATTENDED, ref temp, 0); return retVal; } public void Disconnect() { RAS.RasHangUp(m_ConnectedRasHandle); } } }
代码:
////////////////////////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Dialup.RAS; namespace Dialup { public partial class frmMain : Form { public frmMain() { InitializeComponent(); BindData(); } private void BindData() { try { RASDisplay display = new RASDisplay(); lblName.Text = display.ConnectionName; lblDuration.Text = display.Duration; lblReceived.Text = display.BytesReceived.ToString(); lblTransmitted.Text = display.BytesTransmitted.ToString(); if (!display.IsConnected) { tblCurrentConnection.Visible = false; cboAllConnections.Visible = true; timer1.Stop(); } else { tblCurrentConnection.Visible = true; cboAllConnections.Visible = false; timer1.Start(); } cboAllConnections.DataSource = display.Connections; } catch (Exception e) { MessageBox.Show(e.Message); } } protected void btnConnect_Click(object sender, EventArgs e) { RASDisplay rasDisplay = new RASDisplay(); int ErrorVal = rasDisplay.Connect(cboAllConnections.Text); if (ErrorVal != 0) MessageBox.Show(ErrorVal.ToString()); else timer1.Start(); } protected void btnDisConnect_Click(object sender, EventArgs e) { RASDisplay rasDisplay = new RASDisplay(); rasDisplay.Disconnect(); BindData(); } private void timer1_Tick(object sender, EventArgs e) { BindData(); } } }
可以使用 WinHttp、 托管代码 API (System.Net 类) 或 WinInet 的 INFO: 指南
本文介绍 Windows HTTP 区别 Services (WinHTTP),托管代码 API ( System.Net 命名空间类) 和 Windows Internet API (WinINet)。 (版本 February 2003 软件开发工具包 [SDK],该工具以前缩写的 WinInet 目前称为 WinINet )。 本文旨在帮助您选择您的应用程序需要 Internet 或 Intranet 资源时使用正确的技术。 本文未涵盖更高级别工具 (如 SOAP 工具包,Microsoft XML Core Services (MSXML) 对象中托管的代码的 Web 服务代理或如 CAtlHttpClientT 和 CSoapSocketClientT 的客户端活动模板库 (ATL) Server 类。 必须有更多的控制比此"摘要"部分中的 API 提供,您可以使用套接字 API。
更多信息
受影响的组件应该使用 WinHTTP。 WinHTTP 支持系统服务的上下文。 另一种解决方案是直接使用 System.Net 类或套接字。 有关其他信息,请单...
- 受影响的组件应该使用 WinHTTP。 WinHTTP 支持系统服务的上下文。 另一种解决方案是直接使用 System.Net 类或套接字。 有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应:
238425 (http://support.microsoft.com/kb/238425/EN-US/ ) WinInet 不支持用于服务
- 如果您新托管的 Microsoft 基于 Win 32 项目在 Microsoft C 或 Microsoft C++ 中,使用 WinHTTP 或 System.Net 类,您必须具有的功能是否可通过 WinHTTP 或通过 System.Net 类 (请参阅后面的表)。 如果您在从非托管代码调用托管代码的 API 可以在不重写这些使用托管代码 API。 如果您的应用程序是 Microsoft Visual Basic 6.0 应用程序,使用 WinHttpRequest COM 对象。
- 对于托管的代码的应用程序使用托管的代码的 HTTP 堆栈 ( System.Net.WebRequest 类) (如果该功能可用)。 注意: 其他 HTTP 协议托管类是 HttpWebRequest\HttpWebResponse 和 WebClient 。 有关如何使用类单击下面的文章编号,以查看 Microsoft 知识库中的相应:
303436 (http://support.microsoft.com/kb/303436/EN-US/ ) SAMPLE: Visual C#.NET 网络类 HTTP Internet 客户端
收起该表格
功能 | System.Net (托管) 类 | WinINet API | WinHTTP 5.1 (Win 32 和 COM API) |
---|---|---|---|
HTTP (客户端) | 是。 | 是。 | 是。 |
缓存 | 否。 Microsoft 可能在未来版本中添加此功能。 | 是。 | 否。 |
身份验证 (Basic,摘要,协商,NTLM) | 是。 | 是。 | 是。 |
自动拨号 | 否。 使用远程访问 API。 | 是。 | 否。 使用远程访问 API。 |
Cookie | 否。 只有会话 Cookie。 | 是。 | 否。 只有会话 Cookie。 |
FTP | 否。 您可以为 FTP 实现您自己的协议处理程序。 Microsoft 可能在未来版本中添加 FTP。 | 是。 | 否。 |
P3P | 否。 | 是。 | 否。 |
代理: 包括动态代理 Web 代理自动发现 (WPAD) | 否。 静态代理 (Microsoft 可能会添加动态的代理服务器到将来的版本)。 | 是。 | 是。 |
SSL | 是。 | 是。 | 是。 |
Gopher | 否。 | 是。 | 否。 |
支持服务 | 是。 | 否。 | 是。 |
新功能 | 是。 Microsoft 可能会添加新功能。 | 否。 Microsoft 不会计划添加新功能。 | 是。 Microsoft 可能会添加新的 HTTP 特定功能。 |
操作系统系统支持 | Microsoft Windows 98、 Microsoft Windows Millennium Edition (Windows Me)、 Microsoft Windows NT Server 4.0、 Microsoft Windows 2000 操作系统和 Windows 2000 Service Pack、 Microsoft Windows XP 操作系统和 Windows XP Service Pack、 Microsoft Windows Server 2003 和将来的版本。 | Windows 9 x 、 Windows Me、 Windows NT Server 4.0、 Windows 2000 操作系统和 Windows 2000 Service Pack 的 Windows XP 操作系统和 Windows XP 服务包、 Windows Server 2003 和将来的版本。 | Windows 2000 Service Pack 3 及更高版本、 Windows XP Service Pack 1 和更高版本、 Windows Server 2003 和将来的版本。 |