Login  

Blog Stats

News


Visual Developer - Visual Basic MVP

隨筆分類

文章分類

每月文章

優質好站連結


強力鎯頭 の VB 部落

歡迎蒞臨 Power Hammer の VB 部落 ! J 裡會放一些 VB .Net Oracle Crystal Report 等相關資訊分享給大家囉..

 

如何取得預設連線PPPOE撥接帳號

 

<< VB.Net >> 寫法 1

 

' 匯入名稱空間

Imports System

Imports System.Text

Imports Microsoft.Win32

Imports System.Runtime.InteropServices

 

Public Class Form1

 

    Private Sub Button1_Click(ByVal s As Object, ByVal e As EventArgs) Handles Button1.Click

        Dim ras As New RAS_API

        MessageBox.Show(ras.GetDefDialAcc) ' 取得預設撥接帳號

    End Sub

 

End Class

 

Public Class RAS_API

 

    ' API 宣告

    Private Declare Function RasGetEntryDialParamsA Lib "RasAPI32.dll" _

        (ByVal PB As String, ByRef DialPara As Byte, ByRef Pswd As Integer) As Integer

 

    ' 由登錄檔取得預設連線名稱

    Public Function GetDefDialAcc() As String

        Dim k As String = "Software\Microsoft\RAS AutoDial\Default"

        GetDefDialAcc = Registry.LocalMachine.OpenSubKey(k).GetValue("DefaultInternet")

        Return IIf(GetDefDialAcc.Length > 0, GetDialAcc(GetDefDialAcc), "")

    End Function

 

    ' 根據預設連線取得撥接帳號名稱

    Public Function GetDialAcc(ByVal Entry As String) As String

        GetDialAcc = ""

        Dim b(1060) As Byte

        CpMm(1060, b, 0, 4)

        CpMm(Encoding.Default.GetBytes(Entry), b, 4, 256)

        If RasGetEntryDialParamsA(vbNullString, b(0), 1) = 0 Then

            Return Encoding.Default.GetString(b, 519, 257).TrimEnd(Chr(0))

        End If

    End Function

 

    ' CopyMemory

    Private Sub CpMm(ByRef s As Object, ByRef d As Object, ByVal b As Integer, ByVal l As Integer)

        Marshal.Copy(GCHandle.Alloc(s, GCHandleType.Pinned).AddrOfPinnedObject, d, b, l)

    End Sub

 

End Class

 

 

' ================================================================

 

 

<< VB.Net >> 寫法 2

 

' 匯入名稱空間

Imports System

Imports System.Text

Imports Microsoft.Win32

Imports System.Runtime.InteropServices

 

Public Class Form2

 

    Private Sub Button1_Click(ByVal s As Object, ByVal e As EventArgs) Handles Button1.Click

        Dim r As New RAS

        MessageBox.Show(r.GetDefDialAcc) ' 取得預設撥接帳號

    End Sub

 

End Class

 

Public Class RAS

 

    ' 宣告結構

    <StructLayout(LayoutKind.Sequential)> _

    Public Structure RasDialParas

        Public dwSize As Integer

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=257)> Public EntryName As String

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=129)> Public PhoneNumber As String

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=129)> Public CallbackNumber As String

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=257)> Public UserName As String

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=257)> Public Password As String

        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=16)> Public Domain As String

        Public dwSubEntry As UInt32

        Public dwCallbackId As IntPtr

    End Structure

 

    ' API 宣告

    Private Declare Function RasGetEntryDialParamsA Lib "RasAPI32.dll" _

        (ByVal Phonebook As String, ByRef RasDialPara As RasDialParas, ByRef PswdR As Integer) As Integer

 

    ' 由登錄檔取得預設連線名稱

    Public Function GetDefDialAcc() As String

        Dim k As String = "Software\Microsoft\RAS AutoDial\Default"

        GetDefDialAcc = Registry.LocalMachine.OpenSubKey(k).GetValue("DefaultInternet")

        Return IIf(GetDefDialAcc.Length > 0, GetDialAcc(GetDefDialAcc), "")

    End Function

 

    ' 根據預設連線取得撥接帳號名稱

    Public Function GetDialAcc(ByVal Entry As String) As String

        GetDialAcc = ""

        Dim rdp As New RasDialParas

        rdp.dwSize = 1060

        rdp.EntryName = Entry & New String(Chr(0), 257 - Entry.Length)

        If RasGetEntryDialParamsA(vbNullString, rdp, 1) = 0 Then Return rdp.UserName

    End Function

 

End Class

 

 

' ================================================================

 

 

<< VB6 >> 寫法 1

 

' API 宣告

Private Declare Function RasGetEntryDialParamsA Lib "RasAPI32.dll" _

    (ByVal Phonebook As String, RasDialPara As Byte, _

    PswdRet As Long) As Long

 

Private Declare Sub RtlMoveMemory Lib "Kernel32" _

    (Destination As Any, Source As Any, ByVal Length As Long)

 

Private Sub Command1_Click()

    MsgBox GetDefDialAcc ' 取得預設撥接帳號

End Sub

 

' 由登錄檔取得預設連線名稱

Private Function GetDefDialAcc() As String

    Dim k As String

    k = "HKLM\SOFTWARE\Microsoft\RAS AutoDial\Default\DefaultInternet"

    GetDefDialAcc = CreateObject("WScript.Shell").RegRead(k)

    If GetDefDialAcc <> "" Then GetDefDialAcc = GetDialAcc(GetDefDialAcc)

End Function

 

' 根據預設連線取得撥接帳號名稱

Private Function GetDialAcc(Entry As String) As String

    Dim bytAry(1059) As Byte

    RtlMoveMemory bytAry(0), 1060&, 4&

    Str2Byt bytAry(4), Entry, 256

    If RasGetEntryDialParamsA(vbNullString, bytAry(0), 0&) = 0 Then

        Byt2Str GetDialAcc, bytAry(519), 257

    End If

End Function

 

' 位元陣列轉字串

Private Sub Byt2Str(ByRef C2S As String, ByRef Byt As Byte, ByRef MxL As Long)

   C2S = String(MxL + 1, 0)

   RtlMoveMemory ByVal C2S, Byt, MxL

   C2S = Left(C2S, InStr(C2S, Chr(0)) - 1)

End Sub

 

' 字串轉位元陣列

Private Sub Str2Byt(ByRef Byt As Byte, ByRef S2C As String, ByRef MxL As Long)

    Dim lngLen As Long

    lngLen = Len(S2C)

    If lngLen > 0 Then RtlMoveMemory Byt, ByVal S2C, IIf(lngLen > MxL, MxL, lngLen)

End Sub

 

 

' ================================================================

 

 

<< VB6 >> 寫法 2

 

' 宣告自訂型態

Private Type RasDialPara

    dwSize As Long

    EntryName(256) As Byte

    PhoneNumber(128) As Byte

    CallbackNumber(128) As Byte

    UserName(256) As Byte

    Password(256) As Byte

    Domain(12) As Byte

End Type

 

' API 宣告

Private Declare Function RasGetEntryDialParamsA Lib "rasapi32.dll" _

    (ByVal Phonebook As String, ByRef RasDialPara As RasDialPara, _

    ByRef PswdRet As Long) As Long

 

Private Declare Sub RtlMoveMemory Lib "Kernel32" _

    (Destination As Any, Source As Any, ByVal Length As Long)

 

Private Sub Command1_Click()

    MsgBox GetDefDialAcc ' 取得預設撥接帳號

End Sub

 

 ' 由登錄檔取得預設連線名稱

Private Function GetDefDialAcc() As String

    Dim k As String

    k = "HKLM\SOFTWARE\Microsoft\RAS AutoDial\Default\DefaultInternet"

    GetDefDialAcc = CreateObject("WScript.Shell").RegRead(k)

    If GetDefDialAcc <> "" Then GetDefDialAcc = GetDialAcc(GetDefDialAcc)

End Function

 

' 根據預設連線取得撥接帳號名稱

Private Function GetDialAcc(Entry As String) As String

    Dim EntryName(256) As Byte

    Dim rdp As RasDialPara

    rdp.dwSize = 1060

    Str2Byt rdp.EntryName(0), Entry, Len(Entry)

    If RasGetEntryDialParamsA(vbNullString, rdp, 0) = 0 Then

        GetDialAcc = Chg2Unicode(rdp.UserName)

    End If

End Function

 

' 位元陣列轉字串

Private Function Chg2Unicode(byt() As Byte) As String

    Chg2Unicode = StrConv(byt, vbUnicode)

    Chg2Unicode = Left(Chg2Unicode, InStr(Chg2Unicode, Chr(0)) - 1)

End Function

 

' 字串轉位元陣列

Private Sub Str2Byt(ByRef byt As Byte, ByRef S2C As String, ByRef MxL As Long)

    Dim lngLen As Long

    lngLen = Len(S2C)

    If lngLen > 0 Then RtlMoveMemory byt, ByVal S2C, IIf(lngLen > MxL, MxL, lngLen)

End Sub

 

posted on Wednesday, October 10, 2007 5:46 PM

What People Are Saying About This Post...

No comments posted yet.

What do you have to say?

Title:
Name:
Url:
驗證碼  
Comments: