Страница: 1 | 2 |
|
Вопрос: от ВБ 6 к дот НЕТ RasEnumConnections
|
Добавлено: 24.09.05 03:21
|
|
Номер ответа: 21 Автор ответа: student-uni
Вопросов: 122 Ответов: 257
|
Профиль | | #21
|
Добавлено: 16.10.05 13:13
|
Кое что получилось, спасибо,
но не всё. Например RasEnumDevices:
Функция Анси.
Декларируем при вызове АНСИ
Public Declare Function RasEnumDevices Lib "rasapi32.dll" Alias "RasEnumDevicesA" (ByRef IpRasEntry As RASDEVINFO, ByRef lpcb As Integer, ByVal lpcDevices As Integer) As Integer
декларим структуру:
<StructLayout(LayoutKind.Sequential, Pack:=4, CharSet:=CharSet.Auto)> Structure RASDEVINFO
Public dwSize As Integer
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=17)> Public szDeviceType As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=129)> Public szDeviceName As String
End Structure
Вызываем:
Dim re As RASDEVINFO
Dim bufsize As Integer
Dim res As Integer
re.dwSize = Marshal.SizeOf(re)
bufsize = re.dwSize
res = RasEnumDevices(re, bufsize, 0)
И что же ? - 632 - кажется это неправильный размер структуры
Для справки скажу, что двСайз=296
Ну что же за пакость ?
Ответить
|
Номер ответа: 23 Автор ответа: student-uni
Вопросов: 122 Ответов: 257
|
Профиль | | #23
|
Добавлено: 16.10.05 16:09
|
На счёт книжки я понял, не злитесь уважаемый GSerg, мне нужно время чтобы приобрести указанную вами литературу. В моей деревне это редкость .
АНСИ я объявлял, как вы и рекомендовали ранее в примере авто-опечатка, (пробовал всё возможное).
Огорчает другое,
ошибка 632 имеет место когда я вызываю
функцию в Юникоде а структуру в АНСИ
либо наоборот, фукцию в АНСИ а структуру к ней в Юникоде.
Если же я вызываю одинковыми - и функцию и структуру
либо обе в АНСИ либо обе в Юникоде то имеет место ошибка 87 если не ошибаюсь
ошибка параметра вызываемой функции.
/Кстати при АНСИ размер вышеприведенной структуры уменьшается с 296 до 152 /
Непонятно следующее
у меня Вин2000- система Юникодная - и к ней дотНет2003 которая позволяет
выбирать нужную точку входа / по крайней мере должна позволять/
Вопрос1: почему же не работает когда обе Юникоде ?
Далее, если я ставлю АВТО для функции, то 632 имеется только при Юникоде в структуре,
из чего я могу заключить, что для функции при Авто берётся АНСИ
Вопрос2: почему ?
За LPTSTR от LPSTR и от LPWSTR спасибо.
Ответить
|
Номер ответа: 24 Автор ответа: student-uni
Вопросов: 122 Ответов: 257
|
Профиль | | #24
|
Добавлено: 16.10.05 16:33
|
Ура!! сдвинулось
на счёт Вашего замечания относительно квалификатора Т пока не понял - показывает, что строка может находится в АНСИ или ЮНИКОДЕ,
а за ЛП - спасибо - 32 разрядный УКАЗАТЕЛь !!
Второй параметр был неверный.
Вот код который в принципе работает,
но размер структуры правильно получить пока не удаётся, только со второго раза через хитрый приём с вышеуказанного источника:
Private Declare Auto Function RasEnumDevices Lib "rasapi32.dll" (ByRef IpRasEntry As RASDEVINFO, ByRef lpcb As Integer, ByRef lpcDevices As Integer) As Integer
'бай реф в третьем параметре блин !!!
' а этот деклар для выбивания нужного размера
' структуры см ниже
Private Declare Auto Function RasEnumDevices2 Lib "rasapi32.dll" Alias "RasEnumDevices" (ByVal IpRasEntry As IntPtr, ByRef lpcb As Integer, ByRef lpcDevices As Integer) As Integer
<StructLayout(LayoutKind.Sequential, Pack:=4, CharSet:=CharSet.Auto)> Structure RASDEVINFO
Public dwSize As Integer
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=17)> Public szDeviceType As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=129)> Public szDeviceName As String
End Structure
Dim re As RASDEVINFO
Dim bufsize As Integer
Dim res As Integer
Dim ustr As Integer
re.dwSize = Marshal.SizeOf(re)
bufsize = re.dwSize
res = RasEnumDevices(re, bufsize, ustr)
' тут даёт 603 - ошибочный размер
' и вот тот самый приём получения нужного размера
Dim iptr As IntPtr
iptr = Marshal.AllocHGlobal(bufsize)
Marshal.StructureToPtr(re, iptr, False)
res = RasEnumDevices2(iptr, bufsize, 0)
'и вот теперь - нуль!!! Ура
re = CType(Marshal.PtrToStructure(iptr, GetType(RASDEVINFO)), RASDEVINFO)
Marshal.FreeHGlobal(iptr)
Label28.Text = re.szDeviceType
Label30.Text = re.szDeviceName
Что ж с первого то раза не лезет ?
Ответить
|
Номер ответа: 26 Автор ответа: GSerg
Вопросов: 0 Ответов: 1876
|
Профиль | | #26
|
Добавлено: 16.10.05 18:07
|
В принципе - теоритически - всё должно работать так:
Private Declare Auto Function RasEnumDevices Lib "rasapi32.dll" (<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.LPArray)> ByVal TLPRASDEVINFOA() As RASDEVINFO, ByRef lpcb As Integer, ByRef lpDevices As Integer) As Integer
Private Const RAS_MaxDeviceName As Integer = 128
Private Const RAS_MaxDeviceType As Integer = 16
<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential, charset:=Runtime.InteropServices.CharSet.Auto, pack:=1)> _
Private Structure RASDEVINFO
Public dwSize As Integer
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValTStr, sizeconst:=RAS_MaxDeviceType + 1)> Public szDeviceType As String
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValTStr, sizeconst:=RAS_MaxDeviceName + 1)> Public szDeviceName As String
End Structure
Sub Main()
Dim reqbuf As Integer, reqelem As Integer
Dim devices() As RASDEVINFO
RasEnumDevices(Nothing, reqbuf, reqelem)
ReDim devices(reqelem - 1)
devices(0).dwSize = Runtime.InteropServices.Marshal.SizeOf(GetType(RASDEVINFO))
Console.WriteLine("Результат работы функции: {0}", RasEnumDevices(devices, reqbuf, reqelem))
Console.WriteLine("Имя первого устройства: {0}", devices(0).szDeviceName)
Console.ReadLine()
End Sub
Но не работает.
Поэтому приходится страдать фигнёй.
Private Declare Auto Function RasEnumDevices Lib "rasapi32.dll" (ByVal TLPRASDEVINFOA As IntPtr, ByRef lpcb As Integer, ByRef lpDevices As Integer) As Integer
Private Const RAS_MaxDeviceName As Integer = 128
Private Const RAS_MaxDeviceType As Integer = 16
<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential, charset:=Runtime.InteropServices.CharSet.Auto, pack:=1)> _
Private Structure RASDEVINFO
Public dwSize As Integer
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValTStr, sizeconst:=RAS_MaxDeviceType + 1)> Public szDeviceType As String
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValTStr, sizeconst:=RAS_MaxDeviceName + 1)> Public szDeviceName As String
End Structure
Sub Main()
Dim reqbuf As Integer, reqelem As Integer
Dim devices() As RASDEVINFO
Dim arr, ptr As IntPtr
Dim size As Integer
RasEnumDevices(IntPtr.Zero, reqbuf, reqelem)
arr = Runtime.InteropServices.Marshal.AllocHGlobal(reqbuf)
size = Runtime.InteropServices.Marshal.SizeOf(GetType(RASDEVINFO))
Runtime.InteropServices.Marshal.WriteInt32(arr, 0, size)
RasEnumDevices(arr, reqbuf, reqelem)
ReDim devices(reqelem - 1)
ptr = arr
For reqelem = 0 To reqelem - 1
devices(reqelem) = CType(Runtime.InteropServices.Marshal.PtrToStructure(ptr, GetType(RASDEVINFO)), RASDEVINFO)
ptr = New IntPtr(ptr.ToInt32 + size)
Next
Runtime.InteropServices.Marshal.FreeHGlobal(arr)
For reqelem = devices.GetLowerBound(0) To devices.GetUpperBound(0)
Console.WriteLine(devices(reqelem).szDeviceName)
Next
Console.ReadLine()
End Sub
Ответить
|
Номер ответа: 28 Автор ответа: GSerg
Вопросов: 0 Ответов: 1876
|
Профиль | | #28
|
Добавлено: 17.10.05 00:14
|
Гы.
Учить кого-то - лучший способ начиться самому.
Вот как правильно.
Private Declare Auto Function RasEnumDevices Lib "rasapi32.dll" (<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.LPArray), Runtime.InteropServices.In(), Runtime.InteropServices.Out()> ByVal TLPRASDEVINFOA() As RASDEVINFO, ByRef lpcb As Integer, ByRef lpDevices As Integer) As Integer
Private Const RAS_MaxDeviceName As Integer = 128
Private Const RAS_MaxDeviceType As Integer = 16
<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential, charset:=Runtime.InteropServices.CharSet.Auto, pack:=1)> _
Private Structure RASDEVINFO
Public dwSize As Integer
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValTStr, sizeconst:=RAS_MaxDeviceType + 1)> Public szDeviceType As String
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValTStr, sizeconst:=RAS_MaxDeviceName + 1)> Public szDeviceName As String
End Structure
Sub Main()
Dim reqbuf As Integer, reqelem As Integer
Dim devices() As RASDEVINFO
RasEnumDevices(Nothing, reqbuf, reqelem)
ReDim devices(reqelem - 1)
devices(0).dwSize = Runtime.InteropServices.Marshal.SizeOf(GetType(RASDEVINFO))
RasEnumDevices(devices, reqbuf, reqelem)
For reqelem = 0 To reqelem - 1
Console.WriteLine("Устройство № {0}: {1}", reqelem, devices(reqelem).szDeviceName)
Next
Console.ReadLine()
End Sub
Респект Тёмычу за солюшн.
Ответить
|
Страница: 1 | 2 |
Поиск по форуму