当前位置:编程学习 > C#/ASP.NET >>

急救,关于C#实现ADSL自动拨号类的问题

ADSL自动拨号类,前提是在系统中已经有了一个宽带拨号连接
调用代码:
RASDisplay ras = new RASDisplay();
ras.Disconnect();//断线
ras.Connect("adsl");//拨号  


using System;
using System.Runtime.InteropServices;
public struct RASCONN
{
  public int dwSize;
  public IntPtr hrasconn;
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst=257)]
  public string szEntryName;
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst=17)]
  public string szDeviceType;
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst=129)]
  public string szDeviceName;
}

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)]
public struct RasStats
{
  public int dwSize;
  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 dwConnectionDuration;
}

[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
}
public class RAS

{

    
  [DllImport("Ra<a href="http://dev.21tx.com/corp/sap/" target="_blank">SAP</a>i32.dll", EntryPoint="RasEnumConnectionsA",
  SetLastError=true)]

  internal 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)]
  internal 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 enum DEL_CACHE_TYPE //要删除的类型。
{
  File,//表示internet临时文件
  Cookie //表示Cookie
};
public class RASDisplay
{
  [DllImport("wininet.dll",CharSet=CharSet.Auto)]
  public static extern bool DeleteUrlCacheEntry(
  DEL_CACHE_TYPE type
  );
  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;

  RasStats status = new RasStats();
  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)
  {


  //for (int i = 0; i < lpcConnections; i++)

  //{
  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.dwConnectionDuration /1000) /3600);
  Minutes = ((stats.dwConnectionDuration /1000) /60) - (Hours * 60);
  Seconds = ((stats.dwConnectionDuration /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);
  }
}
--------------------编程问答-------------------- 以上代码能正常断开连接,但是无法自动拨号,而是弹出宽带连接的窗口,
网上说,加上红色这行就可以,但是我加上后,提示““RASDisplay”并不包含“GetConnections”的定义” 请教一下要怎么解决?

RASDisplay ras = new RASDisplay();
  ras.GetConnections();//首先要得到连接,  ras.Disconnect(); //断开连接
  //ras.Connect("ADSL"); //重新拨号 --------------------编程问答-------------------- 那你再修改下代码。 --------------------编程问答-------------------- 没有GetConnections方法 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 2 楼 sihonglaoren 的回复:
那你再修改下代码。


我不知道要怎么修改
这个问题困扰我好几天了,
--------------------编程问答-------------------- 解决了,结贴,谢谢大家
--------------------编程问答-------------------- 请教一下,你是怎么解决的,谢谢 --------------------编程问答-------------------- 楼主怎么解决的,分享下 --------------------编程问答-------------------- 是啊,如何解决的呀,发上来看看呀 --------------------编程问答-------------------- 这种人真恶心,有问题就知道问,问题怎么解决的也不说,恶心 --------------------编程问答--------------------
引用 10 楼 dcdlove123 的回复:
这种人真恶心,有问题就知道问,问题怎么解决的也不说,恶心


非常理解你。

我也希望人人都懂得付出要比索取多一些的道理。 --------------------编程问答-------------------- 咋解决的啊!!!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,