|
PureBasic Мощный кросс-платформенный язык среднего уровня на основе BASIC. Подходит для решения широкого круга задач. |
08.06.2007, 16:29
|
#1
|
Оператор ЭВМ
Регистрация: 10.01.2007
Сообщений: 37
Написано 6 полезных сообщений (для 5 пользователей)
|
RasApi32.DLL - кто знает, как с ней бороться?
Надо определить имена всех Dial Up соединений. У меня их несколько - три по именам сотовых операторов, да ещё и от стационарного телефона. Код на VB6 работает правильно, нашёл в сети код для С++, аналогично, ну ни как не могу
перевести на PureBasic. Вроде и ошибок не выдаёт, и работать не хочет. Может как то не правильно работаю со структурой, или не те типы переменных, или ещё что то? Посмотрите, кто грамотный, где могут быть грабли...
;Для VB6 рабочий пример
; Const RAS95_MaxEntryName = 256
; Private Type RASENTRYNAME95
; dwSize As Long
; szEntryName(RAS95_MaxEntryName) As Byte
; End Type
; 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 Sub Form_Load()
; Dim s As Long, l As Long, ln As Long, a$
; ReDim R(255) As RASENTRYNAME95
; Me.AutoRedraw = True
; R(0).dwSize = 264 'Len(R(0))
; 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)
; Me.Print Left$(a$, InStr(a$, Chr$(0)) - 1)
; Next
; If ln = 0 Then
; Me.Print "No Dial-Up connections found!"
; End If
; End Sub
; **************************************************************
;Для PB v4.01 не рабочий пример:(
#RAS95_MaxEntryName = 256
Structure RASENTRYNAME95
dwSize.l; As Long
szEntryName.b[#RAS95_MaxEntryName]; As Byte
EndStructure
Global Dim R.RASENTRYNAME95(255)
Global s.l,l.l,ln.l,a$
R(0)\dwSize = 264
s = 256 * R(0)\dwSize
l = RasEnumEntries_(#Null,#Null, R(0), s, @ln); ln - кол-во соединений Dial Up определяет правильно!
For l = 0 To ln - 1
;a$=Str(R(l)\szEntryName)
Debug R(l)\szEntryName ; Вот тут не работает!
Next
; Кусок этого кода на C++
; RasEnumEntries(NULL, NULL, &re [0], &cb, &dwEntries);
; For(l = 0; l < dwEntries; l++)
; {
; printf(re[l].szEntryName); Вообще нет ни каких преобразований в Unicode!!!
; }
If ln = 0
Debug "No Dial-Up connections found!"
EndIf
|
(Offline)
|
|
08.06.2007, 19:15
|
#2
|
|
Re: RasApi32.DLL - кто знает, как с ней бороться?
Вроде и ошибок не выдаёт, и работать не хочет.
|
Ну не знаю, лично у меня работает... Только это, почему "Debug R(l)\szEntryName" а не
"Debug PeekS(@R(l)\szEntryName)" ?
|
|
|
08.06.2007, 20:55
|
#3
|
Оператор ЭВМ
Регистрация: 10.01.2007
Сообщений: 37
Написано 6 полезных сообщений (для 5 пользователей)
|
Re: RasApi32.DLL - кто знает, как с ней бороться?
Сообщение от Chrono Syndrome
Ну не знаю, лично у меня работает... Только это, почему "Debug R(l)\szEntryName" а не "Debug PeekS(@R(l)\szEntryName)" ?
|
Потому, что не догадался до PeekS Спасибо, уже что то есть, хотя возвращает только одно имя соединения из 4-х, а вместо остальных пустые строки.
|
(Offline)
|
|
08.06.2007, 22:44
|
#4
|
|
Re: RasApi32.DLL - кто знает, как с ней бороться?
Спасибо, уже что то есть, хотя возвращает только одно имя соединения из 4-х, а вместо остальных пустые строки.
|
Хм, попробуй заменить "RasEnumEntries_(#Null,#Null, R(0), s, @ln)" на "RasEnumEntries_(#Null,#Null, R(0), @s, @ln)".
|
|
|
08.06.2007, 23:21
|
#5
|
Оператор ЭВМ
Регистрация: 10.01.2007
Сообщений: 37
Написано 6 полезных сообщений (для 5 пользователей)
|
Re: RasApi32.DLL - кто знает, как с ней бороться?
Сообщение от Chrono Syndrome
Хм, попробуй заменить "RasEnumEntries_(#Null,#Null, R(0), s, @ln)" на "RasEnumEntries_(#Null,#Null, R(0), @s, @ln)".
|
Попробывал и так s = 256 * SizeOf(RASENTRYNAME95) и так RasEnumEntries_(#Null,#Null, R(0), @s, @ln) ни чего не меняеться...
|
(Offline)
|
|
09.06.2007, 10:12
|
#6
|
|
Re: RasApi32.DLL - кто знает, как с ней бороться?
Попробывал и так s = 256 * SizeOf(RASENTRYNAME95) и так RasEnumEntries_(#Null,#Null, R(0), @s, @ln) ни чего не меняеться...
|
Загвоздка в том, что у меня-то соединение только одно и есть...
Так, ладно, попробуй тогда немного изменить описание структуры:
Structure RASENTRYNAME95
dwSize.l; As Long
szEntryName.b[#RAS95_MaxEntryName]; As Byte
Dummy.L
EndStructure
|
|
|
09.06.2007, 17:05
|
#7
|
ПроЭктировщик
Регистрация: 17.02.2006
Сообщений: 144
Написано 13 полезных сообщений (для 36 пользователей)
|
Re: RasApi32.DLL - кто знает, как с ней бороться?
Structure RASENTRYNAME95
dwSize.l; As Long
szEntryName.s{#RAS95_MaxEntryName}; As Byte
Dummy.L
EndStructure
Вот так эффективнее будет, и никаких РЕЕКОВ не нужно.
А вообще вот решение твоей проблемы:
Все глабли твои заключались только в одной константе: #RAS95_MaxEntryName
Ты ставишь 256 байт, а на самом деле максимальная длина пути 260 байт (может меняться) поэтому рекомендую использовать стандартную константу PureBasic #MAX_PATH, которая тебе поможет автоматически применять длинну пути.
Так же немного изменил я твой код, помечено цветом.
Structure RASENTRYNAME95
dwSize.l
szEntryName.s{#MAX_PATH}
EndStructure
Global Dim R.RASENTRYNAME95(255)
Global s.l,l.l,ln.l,a$
R(0)\dwSize = SizeOf(RASENTRYNAME95) ; <<< Зачем тебе считать, когда можно получить размер.
s = 256 * R(0)\dwSize
RasEnumEntries_(#Null, #Null, R(0), s, @ln)
For l = 0 To ln - 1
Debug "Подключение №"+Str(l+1)+" >>> "+R(l)\szEntryName ; Вот тут не работает!
Next
If ln = 0
Debug "No Dial-Up connections found!"
EndIf
Результат работы программы:
Сообщение от Debug Output
Подключение№1 >>> mts
Подключение№2 >>> qwqw
|
|
(Offline)
|
|
09.06.2007, 17:10
|
#8
|
|
Re: RasApi32.DLL - кто знает, как с ней бороться?
Продолжая тему оптимизации: можно еще переменную "s" выкинуть, и сразу передавать выражение.
|
|
|
09.06.2007, 18:44
|
#9
|
Оператор ЭВМ
Регистрация: 10.01.2007
Сообщений: 37
Написано 6 полезных сообщений (для 5 пользователей)
|
Re: RasApi32.DLL - кто знает, как с ней бороться?
Всем спасибо, пример работает так как надо! К стати, я раньше пытался изменить в структуре на szEntryName.s, но с #RAS95_MaxEntryName = 256
вылетала ошибка доступа к памяти...
Этот пример показывает, что просто не возможно тупо перевести код с одного языка на другой, даже с одного диалекта Бейсика на другой, не говоря уж о других языках - конструкции, работающие на одном языке категорически не хотят работать на другом... Это к вопросу Chrono Syndrome, где то она спрашивала относительно того, что есть ли транслятор с Си на PureBasic- если и напишет кто то такой, то он должен быть реальным профи в этих языках, но Сишники-профи слишком важны и заносчивы, что бы Бейсик учить.
|
(Offline)
|
|
09.06.2007, 18:47
|
#10
|
|
Re: RasApi32.DLL - кто знает, как с ней бороться?
Всем спасибо, пример работает так как надо!
|
OK, тема закрыта.
|
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:05.
|