Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: от ВБ 6 к дот НЕТ RasEnumConnections Добавлено: 24.09.05 03:21  

Автор вопроса:  student-uni

Ответить

  Ответы Всего ответов: 28  

Номер ответа: 16
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #16 Добавлено: 25.09.05 23:42
Я не уверен что в дот нет она должна оставаться такой же а МСДНе никакой инфы по этому поводу нет

Такой инфы там нет потому, что (уж извиняюсь) MSDN - это технический справочник, а не букварь...


Читать Эпплмана. Срочно.

Ответить

Номер ответа: 17
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #17
Добавлено: 26.09.05 07:22
Я не уверен что в дот нет она должна оставаться такой же а МСДНе никакой инфы по этому поводу нет
API-функция одна, следовательно и размер структуры, которая ей передается, один, независимо от того, откуда она вызывается: из VB6, C++, Java или дотнет

Ответить

Номер ответа: 18
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #18 Добавлено: 12.10.05 22:33
Нет уж Позвольте !

1. Размер структуры меняется от операционки к операционке - очень не хилый описан алгоритм определения нужного размера на сайте Муртазина
2. все васиковские лонги - в 2003 - в инт32
3. декларить ф-ции лучше авто, хотя тоже есть тонкости
4. строковые переменные - это самый зад - желательно знать размер и с маршалом ставить вручную. Размеры можно всять из сишного хэдера,
и помнить дворд в 2003 это четыре байта, и каждый символ в строковой - тоже четыре.

Короче я чуть ли не в ручную подрезал каждый параметр.

 Ну типа Всё :-) Сделал её.

Ответить

Номер ответа: 19
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #19 Добавлено: 12.10.05 22:35
А вообще это переписывание - такой онанизм- респект вс2005

Ответить

Номер ответа: 20
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #20 Добавлено: 12.10.05 23:03
Не позволим.

1. Размер структуры можеть только увеличиваться, при этом совместимость со всеми остальными размерами остаётся благодаря dwSize а также тому, что все уже известные члены структуры всегда остаются на своих местах в будущих версиях оной.
2. Ты этого не знал? Это очень, очень странно.
3. Смотря что тебе надо.
4. Отнюдь. При правильном деклэре маршалер справляется на ура. В частности, если параметр API просто объявить as string без всяких атрибутов, всё прекрасно будет работать, как в VB6.
5. Глупости. Размер DWORD если от чего и зависит, так точно не от 200X.
6. Бред полный про 4 байта на символ в строке.

Ответить

Номер ответа: 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

Ну что же за пакость ?

Ответить

Номер ответа: 22
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #22 Добавлено: 16.10.05 13:57
Пакость в том, что надо всё-таки прочитать книжку какую-нибудь.

Для начала, если функция ansi, так и объявляй её ansi, а не auto.
Потом узри отличия LPTSTR от LPSTR и от LPWSTR.

Потом ещё наткнёшься на что-нибудь. И будет так до тех пор, пока не прочитаешь книжку наконец...

Ответить

Номер ответа: 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



Что ж с первого то раза не лезет ?

Ответить

Номер ответа: 25
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #25 Добавлено: 16.10.05 16:51
Допёр. Там нужен масив структур. Устройство то не одно !!!
я получаю размер 296
Требуемый = 1776
Устройств - 6
296*6=1776
Мама дорогая ...

Ответить

Номер ответа: 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

Ответить

Номер ответа: 27
Автор ответа:
 student-uni



Вопросов: 122
Ответов: 257
 Профиль | | #27 Добавлено: 16.10.05 18:33
Суров ты GSerg
Суров но справедлив.

Просящему - дай
Тупого да вразуми. :-)

Ответить

Номер ответа: 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 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам