forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   PureBasic (http://forum.boolean.name/forumdisplay.php?f=90)
-   -   RasApi32.DLL - кто знает, как с ней бороться? (http://forum.boolean.name/showthread.php?t=3563)

kvitaliy 08.06.2007 16:29

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


Chrono Syndrome 08.06.2007 19:15

Re: RasApi32.DLL - кто знает, как с ней бороться?
 
Цитата:

Вроде и ошибок не выдаёт, и работать не хочет.
Ну не знаю, лично у меня работает... Только это, почему "Debug R(l)\szEntryName" а не
"Debug PeekS(@R(l)\szEntryName)" ?

kvitaliy 08.06.2007 20:55

Re: RasApi32.DLL - кто знает, как с ней бороться?
 
Цитата:

Сообщение от Chrono Syndrome
Ну не знаю, лично у меня работает... Только это, почему "Debug R(l)\szEntryName" а не "Debug PeekS(@R(l)\szEntryName)" ?

Потому, что не догадался до PeekS :@ Спасибо, уже что то есть, хотя возвращает только одно имя соединения из 4-х, а вместо остальных пустые строки.

Chrono Syndrome 08.06.2007 22:44

Re: RasApi32.DLL - кто знает, как с ней бороться?
 
Цитата:

Спасибо, уже что то есть, хотя возвращает только одно имя соединения из 4-х, а вместо остальных пустые строки.
Хм, попробуй заменить "RasEnumEntries_(#Null,#Null, R(0), s, @ln)" на "RasEnumEntries_(#Null,#Null, R(0), @s, @ln)".

kvitaliy 08.06.2007 23:21

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) ни чего не меняеться...

Chrono Syndrome 09.06.2007 10:12

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


Maxus 09.06.2007 17:05

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


Chrono Syndrome 09.06.2007 17:10

Re: RasApi32.DLL - кто знает, как с ней бороться?
 
Продолжая тему оптимизации: можно еще переменную "s" выкинуть, и сразу передавать выражение.

kvitaliy 09.06.2007 18:44

Re: RasApi32.DLL - кто знает, как с ней бороться?
 
Всем спасибо, пример работает так как надо! К стати, я раньше пытался изменить в структуре на szEntryName.s, но с #RAS95_MaxEntryName = 256
вылетала ошибка доступа к памяти...
Этот пример показывает, что просто не возможно тупо перевести код с одного языка на другой, даже с одного диалекта Бейсика на другой, не говоря уж о других языках - конструкции, работающие на одном языке категорически не хотят работать на другом... Это к вопросу Chrono Syndrome, где то она спрашивала относительно того, что есть ли транслятор с Си на PureBasic- если и напишет кто то такой, то он должен быть реальным профи в этих языках, но Сишники-профи слишком важны и заносчивы, что бы Бейсик учить.

Chrono Syndrome 09.06.2007 18:47

Re: RasApi32.DLL - кто знает, как с ней бороться?
 
Цитата:

Всем спасибо, пример работает так как надо!
OK, тема закрыта.


Часовой пояс GMT +4, время: 22:48.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot