2011-09-13 81 views
-1

目前我正在開發一個經典vb6實時股票價格表採集卡,如果沒有活動的互聯網連接,它將連接到互聯網。對於互聯網連接過程我使用下面的代碼使用rasapi32.dll,但不幸的是,它總是返回錯誤代碼: - 621,電話簿無法打開。使用vb6撥號連接

代碼是

'This program let you dial to your dial-up connections using whether 
'the stored user name and password or the ones you specifies 
'(It use RasDial for dialing) 
'You need a form with a list,2 textbox and a command button 
Option Explicit 

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, ByVal pSrc As String, ByVal ByteLen As Long) 
Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (Destination As Any, ByVal Length As Long) 
Const RAS95_MaxEntryName = 256 
Const RAS_MaxPhoneNumber = 128 
Const RAS_MaxCallbackNumber = RAS_MaxPhoneNumber 
Const UNLEN = 256 
Const PWLEN = 256 
Const DNLEN = 12 
Private Type RASDIALPARAMS 
    dwSize As Long ' 1052 
    szEntryName(RAS95_MaxEntryName) As Byte 
    szPhoneNumber(RAS_MaxPhoneNumber) As Byte 
    szCallbackNumber(RAS_MaxCallbackNumber) As Byte 
    szUserName(UNLEN) As Byte 
    szPassword(PWLEN) As Byte 
    szDomain(DNLEN) As Bytehttp://stackoverflow.com/questions/1361069/how-can-i-access-hidden-class-variables-in-vb6 
End Type 
Private Type RASENTRYNAME95 
    'set dwsize to 264 
    dwSize As Long 
    szEntryName(RAS95_MaxEntryName) As Byte 
End Type 
Private Declare Function RasDial Lib "rasapi32.dll" Alias "RasDialA" (ByVal lprasdialextensions As Long, ByVal lpcstr As String, ByRef lprasdialparamsa As RASDIALPARAMS, ByVal dword As Long, lpvoid As Any, ByRef lphrasconn As Long) As Long 
Private Declare Function RasEnumEntries Lib "rasapi32.dll" Alias "RasEnumEntriesA" (ByVal reserved As String, ByVal lpszPhonebook As String, lprasentryname As Any, lpcb As Long, lpcEntries As Long) As Long 
Private Declare Function RasGetEntryDialParams Lib "rasapi32.dll" Alias "RasGetEntryDialParamsA" (ByVal lpcstr As String, ByRef lprasdialparamsa As RASDIALPARAMS, ByRef lpbool As Long) As Long 

Private Function Dial(ByVal Connection As String, ByVal UserName As String, ByVal Password As String) As Boolean 
    **Dim rp As RASDIALPARAMS, h As Long, resp As Long** 
    rp.dwSize = Len(rp) + 6 
    ChangeBytes Connection, rp.szEntryName 
    ChangeBytes "", rp.szPhoneNumber 'Phone number stored for the connection 
    ChangeBytes "*", rp.szCallbackNumber 'Callback number stored for the connection 
    ChangeBytes UserName, rp.szUserName 
    ChangeBytes Password, rp.szPassword 
    ChangeBytes "*", rp.szDomain 'Domain stored for the connection 
    'Dial 
    resp = RasDial(ByVal 0, ByVal 0, rp, 0, ByVal 0, h) 'AddressOf RasDialFunc 
    MsgBox resp 
    Dial = (resp = 0) 
End Function 

Private Function ChangeToStringUni(Bytes() As Byte) As String 
    'Changes an byte array to a Visual Basic unicode string 
    Dim temp As String 
    temp = StrConv(Bytes, vbUnicode) 
    ChangeToStringUni = Left(temp, InStr(temp, Chr(0)) - 1) 
End Function 

Private Function ChangeBytes(ByVal str As String, Bytes() As Byte) As Boolean 
    'Changes a Visual Basic unicode string to an byte array 
    'Returns True if it truncates str 
    Dim lenBs As Long 'length of the byte array 
    Dim lenStr As Long 'length of the string 
    lenBs = UBound(Bytes) - LBound(Bytes) 
    lenStr = LenB(StrConv(str, vbFromUnicode)) 
    If lenBs > lenStr Then 
     CopyMemory Bytes(0), str, lenStr 
     ZeroMemory Bytes(lenStr), lenBs - lenStr 
    ElseIf lenBs = lenStr Then 
     CopyMemory Bytes(0), str, lenStr 
    Else 
     CopyMemory Bytes(0), str, lenBs 'Queda truncado 
     ChangeBytes = True 
    End If 
End Function 

Private Sub Command1_Click() 
    Dial List1.Text, Text1, Text2 
End Sub 

Private Sub List1_Click() 
    Dim rdp As RASDIALPARAMS, t As Long 
    rdp.dwSize = Len(rdp) + 6 
    ChangeBytes List1.Text, rdp.szEntryName 
    'Get User name and password for the connection 
    t = RasGetEntryDialParams(List1.Text, rdp, 0) 
    If t = 0 Then 
     Text1 = ChangeToStringUni(rdp.szUserName) 
     Text2 = ChangeToStringUni(rdp.szPassword) 
    End If 
End Sub 

Private Sub Form_Load() 
    'example created by Daniel Kaufmann ([email protected]) 
    'load the connections 
    Text2.PasswordChar = "*" 
    Command1.Caption = "Dial" 
    Dim s As Long, l As Long, ln As Long, a$ 
    ReDim r(255) As RASENTRYNAME95 

    r(0).dwSize = 264 
    s = 256 * r(0).dwSize 
    l = RasEnumEntries(vbNullString, vbNullString, r(0), s, ln) 
    For l = 0 To ln - 1 
     a$ = StrConv(r(l).szEntryName(), vbUnicode) 
     List1.AddItem Left$(a$, InStr(a$, Chr$(0)) - 1) 
    Next 
    If List1.ListCount > 0 Then 
     List1.ListIndex = 0 
     List1_Click 
    End If 
End Sub 

請幫我

+0

你現在已經有一年了,應該知道如何格式化代碼......並且只發布相關部分。 – Filburt

+0

雅,我真的不知道如何格式化代碼,我很抱歉。但如果你能理解這個問題,那麼請幫助我。 –

+0

我只是好奇,你正在開發一個應用程序「現在」,爲什麼你使用vb6而不是vb.net的任何特定原因? – 5StringRyan

回答

0

這可能是沒有幫助的,但谷歌搜索變成了幾個建議,有可能是缺少組件或損壞的電話簿:Error 621: Cannot Open Phonebook

+0

我已經衝進了谷歌,但我沒有找到任何東西,我的電話簿文件沒問題,因爲我已經使用rasdial.exe或正常的Windows XP撥號過程對它進行了測試。我認爲問題出在上面的代碼中,可以請測試一下嗎? –