Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > PureBasic

PureBasic Мощный кросс-платформенный язык среднего уровня на основе BASIC. Подходит для решения широкого круга задач.

Закрытая тема
 
Опции темы
Старый 08.06.2007, 16:29   #1
kvitaliy
Оператор ЭВМ
 
Регистрация: 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
Chrono Syndrome
 
Сообщений: n/a
Re: RasApi32.DLL - кто знает, как с ней бороться?

Вроде и ошибок не выдаёт, и работать не хочет.
Ну не знаю, лично у меня работает... Только это, почему "Debug R(l)\szEntryName" а не
"Debug PeekS(@R(l)\szEntryName)" ?
 
Старый 08.06.2007, 20:55   #3
kvitaliy
Оператор ЭВМ
 
Регистрация: 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
Chrono Syndrome
 
Сообщений: n/a
Re: RasApi32.DLL - кто знает, как с ней бороться?

Спасибо, уже что то есть, хотя возвращает только одно имя соединения из 4-х, а вместо остальных пустые строки.
Хм, попробуй заменить "RasEnumEntries_(#Null,#Null, R(0), s, @ln)" на "RasEnumEntries_(#Null,#Null, R(0), @s, @ln)".
 
Старый 08.06.2007, 23:21   #5
kvitaliy
Оператор ЭВМ
 
Регистрация: 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
Chrono Syndrome
 
Сообщений: n/a
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
Maxus
ПроЭктировщик
 
Регистрация: 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
Chrono Syndrome
 
Сообщений: n/a
Re: RasApi32.DLL - кто знает, как с ней бороться?

Продолжая тему оптимизации: можно еще переменную "s" выкинуть, и сразу передавать выражение.
 
Старый 09.06.2007, 18:44   #9
kvitaliy
Оператор ЭВМ
 
Регистрация: 10.01.2007
Сообщений: 37
Написано 6 полезных сообщений
(для 5 пользователей)
Re: RasApi32.DLL - кто знает, как с ней бороться?

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

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Метаданные и как с ними бороться ABTOMAT Болтовня 7 30.07.2009 20:04
кто знает как сделать??? ger1234567 Основной форум 2 26.12.2008 17:22
Кто знает vadim2 Болтовня 0 27.09.2006 22:45
MDF и MDS Кто знает что за фармат. ЛысыЙ_Чук-Иванчук Болтовня 4 21.09.2006 17:07
Ктонить знает C# (C Sharp)? pax C++ 8 17.04.2006 16:34


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com