Прошу помощи у тех, кому повезло научиться коннектиться по DialUP через код VBA.
Функция RasGetEntryDialParams и RasDial возвращают ошибку, что не найдена запись телефонной книги. Грешу, что в структуре RASDIALPARAMS что-то не так. Может, размер структуры задаю не так. Помогите добиться работоспособности этого кода!
[spoiler]
[/spoiler]
Вопрос пытался решить здесь: http://www.excel-vba.ru/forum/index.php?topic=2586.0
Обошел эту проблему через запуск бат-файла из VBA : http://www.excel-vba.ru/forum/index.php?topic=2650.new#new
Текст батника такой (где-то на форумах нашел и модифицировал под себя):
[spoiler]
@echo off
:: Имя соединения
set connection=Internet Contract
rasdial "%connection:"=%"
pause
[/spoiler]
Интересует все же первый способ коннекта через VBA посредством фции RasDial как более гибкий и технологичный.
Функция RasGetEntryDialParams и RasDial возвращают ошибку, что не найдена запись телефонной книги. Грешу, что в структуре RASDIALPARAMS что-то не так. Может, размер структуры задаю не так. Помогите добиться работоспособности этого кода!
[spoiler]
Код (vb) Выделить
Option Explicit
Const RAS_MaxEntryName = 256
Const RAS_MaxPhoneNumber = 128
Const RAS_MaxCallbackNumber = RAS_MaxPhoneNumber
Const RAS_MaxAreaCode = 10
Const RAS_MaxDeviceType = 16
Const RAS_MaxDeviceName = 128
Const RAS_MaxPadType = 32
Const RAS_MaxX25Address = 200
Const RAS_MaxFacilities = 200
Const RAS_MaxUserData = 200
Const UNLEN = 256
Const PWLEN = 256
Const DNLEN = 15
Private Type RASDIALPARAMS
dwSize As Long ' 1052
dwSubEntry As Long
dwIfIndex As Long
dwCallbackId As Long
szEntryName(RAS_MaxEntryName + 1) As Byte
szPhoneNumber(RAS_MaxPhoneNumber + 1) As Byte
szCallbackNumber(RAS_MaxCallbackNumber + 1) As Byte
szUserName(UNLEN + 1) As Byte
szPassword(PWLEN + 1) As Byte
szDomain(DNLEN + 1) As Byte
End Type
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)
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 RasGetEntryDialParams Lib "rasapi32.dll" Alias "RasGetEntryDialParamsA" (ByVal lpcstr As String, ByRef lprasdialparamsa As RASDIALPARAMS, ByRef lpbool As Long) As Long
Sub gogogo()
Form.Show
End Sub
Private Sub Dial_xx()
Dim FParams As RASDIALPARAMS
Dim FConnHandle As Long
Dim lpbool As Long
Dim t As Long
Dim resp As Long
Dim Path As String
FParams.dwSize = 1052
ChangeBytes "Internet Contract", FParams.szEntryName ' загнали текст имени соединения в переменную szEntryName (в виде байтов)
'path = "c:\ProgramData\Microsoft\Network\Connections\Pbk\rasphone.pbk" ' путь к телефонной книге. Из нее соединения коннектятся отлично
t = RasGetEntryDialParams(vbNullString, FParams, lpbool)
FConnHandle = 0
resp = RasDial(ByVal 0, ByVal 0, FParams, 0, ByVal 0, FConnHandle)
End Sub
Private Function ChangeBytes(ByVal str As String, Bytes() As Byte) As Boolean
'Конвертор текстовой стоки из Юникода в читабельный байтовый массив. Его кушает RasAPI:))
'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
ChangeBytes = True
End If
End Function
[/spoiler]
Вопрос пытался решить здесь: http://www.excel-vba.ru/forum/index.php?topic=2586.0
Обошел эту проблему через запуск бат-файла из VBA : http://www.excel-vba.ru/forum/index.php?topic=2650.new#new
Текст батника такой (где-то на форумах нашел и модифицировал под себя):
[spoiler]
@echo off
:: Имя соединения
set connection=Internet Contract
rasdial "%connection:"=%"
pause
[/spoiler]
Интересует все же первый способ коннекта через VBA посредством фции RasDial как более гибкий и технологичный.
