建一个FROM1文件
代码如下Private Const RAS95_MaxEntryName = 256
Private Const RAS95_MaxDeviceName = 128
Private Const RAS95_MaxDeviceType = 16Private Type RASCONN95
  'set dwsize to 412
  dwSize As Long '该结构所占内存的大小(Bytes)
  hRasConn As Long '活动连接的句柄
  szEntryName(RAS95_MaxEntryName) As Byte '活动连接的名称
  szDeviceName(RAS95_MaxDeviceName) As Byte '活动连接的所用的设备名称
  szDeviceType(RAS95_MaxDeviceType) As Byte '活动连接的所用的设备类型
End TypePrivate Declare Function RasEnumConnections Lib "rasapi32.dll" Alias "RasEnumConnectionsA" (lprasconn As Any, lpcb As Long, lpcConnections As Long) As LongPrivate lpchWnd As RASCONN95
Private lpcWidth As Long
Private lpcConnNum As Long
'----------------------------------------
'
'获得IP地址
Private Const ras_MaxIPAddress = 15Private Type RASPPPIP
  dwSize As Long 'set dwsize to 40
  dwError As Long
  szIpAddress(ras_MaxIPAddress) As Byte
  szServerAddress(ras_MaxIPAddress) As Byte
End TypePrivate Declare Function RasGetProjectionInfo Lib "rasapi32.dll" Alias "RasGetProjectionInfoA" ( _
ByVal hRasConn As Long, ByVal rasprojection As Long, lpprojection As RASPPPIP, lpcb As Long) As LongPrivate Const RASP_PppIp = &H8021
Private lpcPPPIP As RASPPPIP
Private lpcb As Long
'----------------------------------------------------------
Private Sub Form1_Load()
  If RasEnumConnections(lpchWnd, lpcWidth, lpcConnNum) = 0 Then
  If lpcConnNum > 0 Then
    
  'lpcPPPIP.dwSize = 40  If RasGetProjectionInfo(lpchWnd.hRasConn, RASP_PppIp, lpcPPPIP, 40) = 0 Then
  '**************************************************
  Debug.Print StrConv(lpcPPPIP.szIpAddress, vbUnicode)
  End If
End IfEnd If
End SubPrivate Sub Form_Load()
Me.Show
     Dim Conns As Long '记录当前连接数
     ReDim RasConn(255) As RASCONN95 '记录
     Dim lRet As Long '接受枚举返回
     Dim lSize As Long '数组总长度
     Dim i As Long '循环变量
     Dim j As Long '循环变量
     'Dim Item As ListItem '列表项
     RasConn(0).dwSize = 412
     lSize = RasConn(0).dwSize * 255
     lRet = RasEnumConnections(RasConn(0), lSize, Conns)
     '排除枚举错
     If lRet <> 0 Then Exit SubFor i = 0 To Conns - 1
List1.AddItem Replace(StrConv(RasConn(i).szEntryName, vbUnicode), Chr(0), "")
'lji = Replace(StrConv(RasConn(i).hRasConn, vbUnicode), Chr(0), "")
     If RasGetProjectionInfo(RasConn(i).hRasConn, RASP_PppIp, lpcPPPIP, 40) <> 0 Then
       'lpcPPPIP.dwSize = 40
     tip = Replace(StrConv(lpcPPPIP.szIpAddress, vbUnicode), Chr(0), "")
    End If
NextEnd Sub-----------------------------------------------------------------------------------------------------
For i = 0 To Conns - 1
List1.AddItem Replace(StrConv(RasConn(i).szEntryName, vbUnicode), Chr(0), "")
这个可以获得连接名称.
但怎么下面的
lpcPPPIP.szIpAddress
就得不到那个连接的IP地址呢?另附一些Delphi参考资料

解决方案 »

  1.   

    在WIN9X下,如果安装了拨号网络,则在WINDOWS系统的系统目录System下将有两个拨号网络管理程序库RasApi32.DLL和RasApi16.DLL,我们可利用其中的RAS系列函数来获取和设置拨号连接网络的信息。当然是可以获取拨号连接的动态IP地址了。在Delphi帮助文件中,有相关RAS函数的详细说明。 
    ---- 一、先解释一些要用到的数据常量和数据结构。 const
    RAS_MaxDeviceType = 16;//设备类型名称长度
    RAS_MaxEntryName = 256;//连接名称最大长度
    RAS_MaxDeviceName = 128;//设备名称最大长度
    RAS_MaxIpAddress = 15;//IP地址的最大长度
    RASP_PppIp = $8021;//拨号连接的协议类型,该数值表示PPP连接type
    HRASCONN = DWORD;//拨号连接句柄的类型
    RASCONN = record//活动的拨号连接的句柄和设置信息
    dwSize : DWORD;//该结构所占内存的大小(Bytes),
     一般设置为SizeOf(RASCONN)
         hrasconn : HRASCONN;//活动连接的句柄
    szEntryName : array[0..RAS_MaxEntryName] of char;
     //活动连接的名称
    szDeviceType : array[0..RAS_MaxDeviceType] of char;
    //活动连接的所用的设备类型
    szDeviceName : array[0..RAS_MaxDeviceName] of char;
    //活动连接的所用的设备名称
    end;
    TRASPPPIP = record//活动的拨号连接的动态IP地址信息
    dwSize : DWORD;//该结构所占内存的大小(Bytes),
    一般设置为SizeOf(TRASPPPIP)
         dwError : DWORD;//错误类型标识符
    szIpAddress : array[ 0..RAS_MaxIpAddress ] of char;
    //活动的拨号连接的IP地址
    end;
    ---- 二、接着要解释要用到的两个RAS函数。 //获取所有活动的拨号连接的信息(连接句柄和设置信息)
    function RasEnumConnections( var lprasconn : RASCONN ;
    //接收活动连接的缓冲区的指针
         var lpcb: DWORD;//缓冲区大小
         var lpcConnections : DWORD//实际的活动连接数
        ) : DWORD; stdcall;
    function RasEnumConnections;external 'Rasapi32.dll'
     name 'RasEnumConnectionsA';
    //获取指定活动的拨号连接的动态IP信息
    function RasGetProjectionInfo(
         hrasconn : HRasConn;//指定活动连接的句柄
         rasprojection : DWORD;//RAS连接类型
         var   lpprojection : TRASPPPIP;//接收动态IP信息的缓冲区
         var   lpcb : DWord//接收缓冲区的大小
        ) : DWORD;stdcall;
    function RasGetProjectionInfo;external 
    'Rasapi32.dll' name 'RasGetProjectionInfoA';
      这两个函数的返回值为0时表示执行成功,非0表示错误代码。 ---- 三、下面要讨论如何用上面的两个RAS函数获取拨号连接的动态IP地址 ----   首先,要用函数RasEnumConnections列出已建立的活动拨号连接的信息,其中包括连接名称、连接句柄、连接设备类型和设备名称;然后根据连接句柄用函数RasGetProjectionInfo获取连接对应的一个TRASPPPIP结构,其中包括一个成员属性szIpAddress即为动态IP地址。具体请参见以下程序片段和注释信息。 procedure TForm1.Button1Click(Sender: TObject);
    const
          MaxConnections = 10;//假设最多有10个活动的拨号连接
    var
        connections : array[0..MaxConnections-1] of RASCONN;
        //拨号连接数组
        longSize : dword;
        intAvailabelConnections : dword;
        //活动的拨号连接的实际数目
        intIndex : integer;
        strTemp : string;
        dwResult : DWORD;
        dwSize          : DWORD;
        RASpppIP      : TRASPPPIP;
    //活动的拨号连接的动态IP地址信息
    begin
          connections[ 0 ].dwSize := sizeof(RASCONN);
          longSize := MaxConnections * connections[ 0 ].dwSize;
    //接收活动连接的缓冲区大小
          intAvailabelConnections := 0;
          //获取所有活动的拨号连接的信息(连接句柄和设置信息)
          dwResult := RasEnumConnections( connections[ 0 ],
     longSize,intAvailabelConnections );
          if 0 < > dwResult then
             memo1.lines.add( '错误:' + inttostr( dwResult ) )
          else
              begin
                   memo1.lines.add( '现有的活动连接有' +
     IntToStr( intAvailabelConnections ) + '个');
    //显示所有活动的拨号连接的信息(设置信息和动态IP地址)
             for intIndex := 0 to intAvailabelConnections - 1 do
                          begin
    //显示一个活动的拨号连接的设置信息
                               strTemp := '连接名称:'
     + StrPAS( connections[ intIndex ].szEntryName )
                                        + ',设备类型:'
     + StrPAS( connections[ intIndex ].szDeviceType )
                                        + ',设备名称:'
     + StrPAS( connections[ intIndex ].szDeviceName );
                               memo1.lines.add( strTemp );
     //显示一个活动的拨号连接的动态IP地址
                               dwSize := SizeOf(RASpppIP);
                               RASpppIP.dwSize := dwSize;
                               dwResult := RASGetProjectionInfo
    ( connections[ intIndex ].hRasConn,
    RASP_PppIp,RasPPPIP,dwSize);//获取动态IP地址
                               if   0 < > dwResult then
                                   memo1.lines.add(
    '错误:' + inttostr( dwResult ))
                               else
                                   memo1.lines.add(
     '动态地址:' + StrPas(RASpppIP.szIPAddress));
                          end;
              end;
    end;
      

  2.   

    有啊宝贝.
    ADSL和VPN也算是拔号网络啊
      

  3.   

    哈哈哈...找到了个代码.能显示VPN连接了..