powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA EXCEL и RAS API. Как установить коннект через Dial-Up?
4 сообщений из 4, страница 1 из 1
VBA EXCEL и RAS API. Как установить коннект через Dial-Up?
    #38453907
Игорь_777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет! Столкнулся с необходимостью выполнить следующие задачи, связанные с удаленным соединением:

1. Проверить наличие и статус удаленного соединения;
2. Если статус соединения- "разъединено", то выполнить коннект.
3. При необходимости разорвать соединение.

Перерыл много форумов и вышел на функции RAS API. Удалось решить вопросы 1(используя функции RasEnumConnections и RasGetConnectStatus) и 3 (используя функцию RasHangUp). Т.е. теперь я могу узнать, что соединение физически существует и оно соединено/разорвано. Могу его разорвать принудительно.

Но вот никак не разберусь с функцией RasDial, которая устанавливает соединение. Мне достаточно использовать параметры соединения по умолчанию, необходимо только правильно задать переменные для этой функции, с чем, подозреваю, у меня проблемы.
К сожалению, я не программирую в Delphi или С++, а все примеры по использованию функций RAS API прописаны, в основном, на этих языках.

Прошу знающих людей помочь с кодом VBA для вызова функции RasDial и установлением соединения.

P.S. Как вариант, рассматриваю возможность оперировать с соотв. окнами через API-функции, но это как-то коряво, учитывая, что они опять же, сами используют RAS API в своей работе.
...
Рейтинг: 0 / 0
VBA EXCEL и RAS API. Как установить коннект через Dial-Up?
    #38454081
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю, если вы приведете примеры на Си (используя тэги оформления кода именно для Си и спойлер, если большая простыня), вам помогут с переводом
...
Рейтинг: 0 / 0
VBA EXCEL и RAS API. Как установить коннект через Dial-Up?
    #38468050
Игорь_777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, после пары недель мучений имею следующее :
UserForm со списком доступных соединений и кнопку "Dial" для дозвона выбранного соединения.

Корректно определяются доступные соединения, однако при попытке дозвона функция RasDial возвращает 0 (типа подключился), но вот статус соединения остается неизменным- фактически связи нет. При этом, если попытаться позвонить еще раз, то выходит ошибка 623- "подключение уже выполнено". Та же ошибка выходит при попытке подконнектиться штатной звонилкой. Есть кнопка "позвонить", но при нажатии соединение как бы занято. Как только я закрываю EXCEL, сразу становится возможным дозвон из штатной звонилки.

Заметил, что фукция RasGetEntryDialParams при вызове хоть и возвращает 0 (норма), но структуру RASDIALPARAMS почему-то не заполняет данными, типа телефонного номера и пароля.

Перед вызовом функции RasDial я просматриваю структуру RASDIALPARAMS. .szEntryName содержит имя выбранного соединения, но вроде этого и достаточно, остальное должно подхватываться по умолчанию из телефонной книги...
Ребята, объясните, где я накосячил?))

P.S. Винда 7 64bit



Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
'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 Byte
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 Long, 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) As Boolean
    Dim rp As RASDIALPARAMS, h As Long, resp As Long, str As String, t As Long
    
    rp.dwSize = Len(rp) + 6
    ChangeBytes Connection, rp.szEntryName
    t = RasGetEntryDialParams(vbNullString, rp, 0)
    h = 0
    'Dial
    resp = RasDial(0, 0, rp, 0, 0, h)   'AddressOf RasDialFunc
    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
End Sub


Private Sub List1_Click()
    Dim rdp As RASDIALPARAMS, t As Long
    rdp.dwSize = Len(rdp) + 6
    ChangeBytes List1.Text, rdp.szEntryName
End Sub

Private Sub UserForm_Activate()
    
    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



Модератор: Учимся использовать тэги оформления кода и спойлеры для длинных простыней - FAQ
...
Рейтинг: 0 / 0
VBA EXCEL и RAS API. Как установить коннект через Dial-Up?
    #38472693
Игорь_777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Специалисты,где же вы, ну поделитесь идеями! )) Я не могу понять, это проблема кода или все же проблема платформы? К сожалению, проверить на XP я не могу, мобильный интернет только на работе, дома LAN....
Перелопачивая исходники и анализируя их, отметил, что иногда приходится проверять, на какой платформе будет работать код, и соответственно, менять значения переменнных. К сожалению, исходники уже не новые, 7ки тогда еще не было))). Поэтому я начинаю думать, что код, отлично работающий под XP, на 7ке работает уже некорректно. Например, я не могу получить ни номера соединения, ни пароля (пусть хоть ввиде звездочек), ни остальных параметров соединения.

Поэтому как задачу-минимум, хочу всего лишь установить соединение, выбранное по умолчанию без каких-либо изменений его параметров.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA EXCEL и RAS API. Как установить коннект через Dial-Up?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]