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

创建PPPOE连接出错,请高手看下问题出在哪里。

--------------------编程问答-------------------- 你的API声明全是VB6的,自然不行。比如VB6的Long,在VB.NET中是Integer。 --------------------编程问答-------------------- 还有其它错误吗?已经把Long改成Integer,问题依旧。代码是从VB6移过来的(我只会用点儿VB6),换了VS2010然后才发现VS2010对我来说和一种完全不同的编程语言一样,刚把代码复制过来一片错误,上网搜索无数资料修修补补搞了两天,卡在这里实在过不去了,只好发贴求助了,还望各位高手不吝赐教。
Option Explicit On
Imports System
Imports System.Text
Imports Microsoft.Win32
Imports System.Runtime.InteropServices

Public Class FormMain

    Public Const MAX_PATH As Int32 = 260
    Public Const RAS_MaxPATH As Int32 = 259
    Public Const RAS_MaxUserName As Int32 = 256
    Public Const RAS_MaxPassword As Int32 = 256
    Public Const RAS_MaxDomain As Int32 = 15
    Public Const RAS_MaxX25PadType As Int32 = 31
    Public Const RAS_MaxDeviceType As Int32 = 16
    Public Const RAS_MaxPhoneNumber As Int32 = 128
    Public Const RAS_MaxIpAddress As Int32 = 15
    Public Const RAS_MaxIpxAddress As Int32 = 21


    Public Const RAS_MaxEntryName As Int32 = 256
    Public Const RAS_MaxDeviceName As Int32 = 128
    Public Const RAS_MaxCallbackNumber As Int32 = RAS_MaxPhoneNumber

    Public Const RAS_MaxAreaCode As Int32 = 10
    Public Const RAS_MaxPadType As Int32 = 32
    Public Const RAS_MaxX25Address As Int32 = 200
    Public Const RAS_MaxFacilities As Int32 = 200
    Public Const RAS_MaxUserData As Int32 = 200
    public const RAS_MaxReplyMessage  As Int32 =   1024
    Public Const RAS_MaxDnsSuffix As Int32 = 256

    Public Structure GUID
        Public Data1 As UInteger
        Public Data2 As UShort
        Public Data3 As UShort
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=8)> Public data4 As String
    End Structure

    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Public Structure RASDIALPARAMS
        Public Size As Int32
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxEntryName + 1)> Public EntryName As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxPhoneNumber + 1)> Public PhoneNumber As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxCallbackNumber + 1)> Public CallBackNumber As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxUserName + 1)> Public UserName As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxPassword + 1)> Public Password As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxDomain + 1)> Public Domain As String
        Public dwSubEntry As Integer
        Public dwCallbackId As UInt32
    End Structure

    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Public Structure RASIPADDR
        Public a As Byte
        Public b As Byte
        Public c As Byte
        Public d As Byte
    End Structure

    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Public Structure RASENTRY
        Public dwSize As Int32
        Public dwfOptions As Int32
        Public dwCountryID As Int32
        Public dwCountryCode As Int32
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxAreaCode + 1)> Public szAreaCode As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxPhoneNumber + 1)> Public szLocalPhoneNumber As String
        Public dwAlternateOffset As Int32
        Public ipaddr As RASIPADDR
        Public ipaddrDns As RASIPADDR
        Public ipaddrDnsAlt As RASIPADDR
        Public ipaddrWins As RASIPADDR
        Public ipaddrWinsAlt As RASIPADDR
        Public dwFrameSize As Int32
        Public dwfNetProtocols As Int32
        Public dwFramingProtocol As Int32
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxPATH)> Public szScript As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxPATH)> Public szAutodialDll As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxPATH)> Public szAutodialFunc As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxDeviceType + 1)> Public szDeviceType As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxDeviceName + 1)> Public szDeviceName As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxX25PadType + 1)> Public szX25PadType As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxX25Address + 1)> Public szX25Address As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxFacilities + 1)> Public szX25Facilities As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxUserData + 1)> Public szX25UserData As String
        Public dwChannels As Int32
        Public dwReserved1 As Int32
        Public dwReserved2 As Int32
        Public dwSubEntries As Int32
        Public dwDialMode As Int32
        Public dwDialExtraPercent As Int32
        Public dwDialExtraSampleSeconds As Int32
        Public dwHangUpExtraPercent As Int32
        Public dwHangUpExtraSampleSeconds As Int32
        Public dwIdleDisconnectSeconds As Int32
        Public dwType As Int32
        Public dwEncryptionType As Int32
        Public dwCustomAuthKey As Int32
        Public guidId As GUID
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAX_PATH)> Public szCustomDialDll As String
        Public dwVpnStrategy As Int32
        Public dwfOptions2 As Int32
        Public dwfOptions3 As Int32
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxDnsSuffix)> Public szDnsSuffix As String
        Public dwTcpWindowSize As Int32
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAX_PATH)> Public szPrerequisitePbk As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=RAS_MaxEntryName + 1)> Public szPrerequisiteEntry As String
        Public dwRedialCount As Int32
        Public dwRedialPause As Int32
    End Structure


    <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Public Structure RASCREDENTIALS
        Public dwSize As Integer
        Public dwMask As Integer
        Public szUserName() As Byte
        Public szPassword() As Byte
        Public szDomain() As Byte
    End Structure

    Public Declare Auto Function RasSetEntryDialParams Lib "rasapi32.dll" (ByVal PhoneBook As String, ByRef DialParams As RASDIALPARAMS, ByRef Password As Int32) As Int32

    Private Sub FormMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Create_PPPoE_Connection("PPPOE1", "test", "123456")
    End Sub

    '==================================================================================
    '函数名称   Create_PPPoE_Connection(ByVal sEntryName As String, ByVal sUserName As String, ByVal sPassword As String) As Boolean
    '参    数   sEntryName      连接名称
    '           sUserName       用户名
    '           sPassword       密码
    '描    述   创建PPPOE拨号连接
    '示    例   Create_PPPoE_Connection("宽带连接","user01","123456")
    '==================================================================================

    Private Const ET_None As Integer = 0               '   No   encryption
    Private Const ET_Require As Integer = 1               '   Require   Encryption
    Private Const ET_RequireMax As Integer = 2               '   Require   max   encryption
    Private Const ET_Optional As Integer = 3               '   Do   encryption   if   possible.   None   Ok.

    Private Const VS_Default As Integer = 0               '   default   (PPTP   for   now)
    Private Const VS_PptpOnly As Integer = 1               '   Only   PPTP   is   attempted.
    Private Const VS_PptpFirst As Integer = 2               '   PPTP   is   tried   first.
    Private Const VS_L2tpOnly As Integer = 3               '   Only   L2TP   is   attempted.
    Private Const VS_L2tpFirst As Integer = 4               '   L2TP   is   tried   first.

    Private Const RASET_Phone As Integer = 1             '   Phone   lines:   modem,   ISDN,   X.25,   etc
    Private Const RASET_Vpn As Integer = 2             '   Virtual   private   network
    Private Const RASET_Direct As Integer = 3             '   Direct   connect:   serial,   parallel
    Private Const RASET_Internet As Integer = 4               '   BaseCamp   internet
    Private Const RASET_Broadband As Integer = 5           '   Broadband

    Private Declare Function RasSetEntryProperties Lib "rasapi32" Alias "RasSetEntryPropertiesA" (ByVal lpszPhonebook As String, ByVal lpszEntry As String, ByVal lpRasEntry As RASENTRY, ByVal dwEntryInfoSize As Integer, ByVal lpbDeviceInfo As Integer, ByVal dwDeviceInfoSize As Integer) As Integer
    Private Declare Function RasSetCredentials Lib "rasapi32" Alias "RasSetCredentialsA" (ByVal lpszPhonebook As String, ByVal lpszEntry As String, ByVal lpCredentials As RASCREDENTIALS, ByVal fClearCredentials As Integer) As Integer

    Private Function Create_PPPoE_Connection(ByVal sEntryName As String, ByVal sUserName As String, ByVal sPassword As String) As Boolean
        Create_PPPoE_Connection = False

        Dim re As New RASENTRY
        Dim sDeviceName As String, sDeviceType As String

        sDeviceName = "WAN 微型端口 (PPTP)"
        sDeviceType = "PPPoE"
        With re
            .dwSize = Marshal.SizeOf(re)
            .dwCountryCode = 86
            .dwCountryID = 86
            .dwDialExtraPercent = 75
            .dwDialExtraSampleSeconds = 120
            .dwDialMode = 1
            .dwEncryptionType = 3
            .dwfNetProtocols = 4
            .dwfOptions = 1024262928
            .dwfOptions2 = 367
            .dwFramingProtocol = 1
            .dwHangUpExtraPercent = 10
            .dwHangUpExtraSampleSeconds = 120
            .dwRedialCount = 3
            .dwRedialPause = 60
            .dwType = RASET_Broadband
            .szDeviceName = sDeviceName
            .szDeviceType = sDeviceType
        End With

        Dim params As New RASDIALPARAMS

        params.Size = Marshal.SizeOf(params)
        params.EntryName = sEntryName
        params.UserName = sUserName
        params.Password = sPassword
        Dim bFlag As Int32 = 0


        RasSetEntryProperties(vbNullString, sEntryName, re, Marshal.SizeOf(re), 0, 0)

    End Function


End Class
--------------------编程问答-------------------- 除 --------------------编程问答-------------------- 用命令行拔号吧。  --------------------编程问答--------------------
引用 4 楼 WM_JAWIN 的回复:
用命令行拔号吧。 

拨号功能我已经实现了,只是创建拨号功能没有实现。另外命令行能创建拨号吗?能创建的话也行啊。 --------------------编程问答-------------------- 在system32下,有几个ras开头的exe文件,rasdial.exe是拔号用的,有兴趣你可以去研究一下 --------------------编程问答--------------------
引用 6 楼 WM_JAWIN 的回复:
在system32下,有几个ras开头的exe文件,rasdial.exe是拔号用的,有兴趣你可以去研究一下

看过,rasdial.exe 只能拨号(必须先用其它方法创建好拨号连接),不能创建拨号连接。
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,