API в VB.NET (великая тайна)

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

API в VB.NET (великая тайна)

Сообщение Shurrik » 10.03.2007 (Сб) 10:42

Несколько дней убил на то, чтобы попытаться заставить работать одну АПИшку. В ней всего-то надо передать адрес памяти, где находится некая структура.
В VB6 все отлично получается при помощи adr=VarPtr(mSrtucture).
В Интернете разного рода лабуды по этому поводу вагон и маленькая тележка. Читать все подряд уже нет сил. К сожалению никто не хочет написать маленькую строчку кода, которая делает то же самое. Создается впечатление, что АПИшки, подобные моей в VB.NET нельзя заставить работать вообще. Великая тайна! Тсс…
Великие гуру пожалейте несчастного юзера, выложите код, откройте тайну.
Колесо: Хочешь жить? Умей вертеться.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.03.2007 (Сб) 10:59

Если в VB6 тебе требовалось делать adr=VarPtr(mSrtucture), это значит, что ты неудобно объявил ту самую АПИшку.
А между тем, если бы ты объявил её искомый параметр удобно - as any или as MyStruct, - тебе вообще не потребовался бы varptr.
Точно так же всё в VB .net, за исключением отсутствия any - но оно тебе не надо.
RTFM. Много и срочно. Пробел большой очень в картине.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 10.03.2007 (Сб) 11:27

В принципе GSerg ответил все, что нужно, но если бы автор соизволил бы пояснить, что за апишку он не смог приручить, то, возможно, получил бы более полный ответ. А так, что спросил, то и получил.
Весь мир матрица, а мы в нем потоки байтов!

Shurrik
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 110
Зарегистрирован: 20.05.2004 (Чт) 5:35
Откуда: Керчь, Крым

Сообщение Shurrik » 11.03.2007 (Вс) 9:41

Я хотел получить ответ на вопрос в общем виде, чтобы любой человек мог им воспользоваться, когда столкнется с похожей проблемой. То есть при переводе программ с VB6 на VB.NET.
Нашел работающий код на VB6 (огромное спасибо SCINER), который ведет захват и запись видео в AVI- файл. Перевел его на VB.NET (у меня VS2003) и застрял на одной АПИшке.
Код на VB6:
Код: Выделить всё
Private Declare Function AVISaveOptions Lib "avifil32.dll" (ByVal hWnd As Long, ByVal uiFlags As Long, ByVal nStreams As Long, ByRef ppavi As Long, ByRef ppOptions As Long) As Long
.
Dim res As Long
Dim ps As Long
Dim opts As AVI_COMPRESS_OPTIONS
Dim pOpts As Long
.
  'Запрашиваем опции компрессии у пользователя. Функция требует указатель на указатель на UDT
pOpts = VarPtr(opts)
res = AVISaveOptions(0, 3, 1, ps, pOpts)                                                                                                 

И видим изменения в структуре opts в зависимости от выбранного кодека

Код на VB.NET после конвертации VS2003:
Код: Выделить всё
Private Declare Function AVISaveOptions Lib "avifil32.dll" (ByVal hWnd As Integer, ByVal uiFlags As Integer, ByVal nStreams As Integer, ByRef ppavi As Integer, ByRef ppOptions As Integer) As Integer
.
Dim res As Integer
Dim ps As Integer
Dim opts As AVI_COMPRESS_OPTIONS
Dim pOpts As Integer
.
'UPGRADE_ISSUE: VarPtr function is not supported. Click for more: 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1040"'
pOpts = VarPtr(opts)
res = AVISaveOptions(0,3, 1, ps, pOpts)

Полный проект лежит на http://forum.sources.ru/index.php?showtopic=171196.

Согласен на любой вариант ответа, при условии, что это будет работающий код на VB.NET, который записывает видеофайл типа avi (на mpeg тоже с радостью соглашусь, ели у кого есть). Мне не нужны теории и коды на С, Delphi и т.д.
Мне нужен код. КОД!!! Не жадничайте, коллеги. Может и я когда-нибудь пригожусь.
Колесо: Хочешь жить? Умей вертеться.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.03.2007 (Вс) 11:16

Функция требует не указатель на указатель на UDT, функция требует указатель на массив указателей на UDT. Причём по этим указателям она будет возвращать данные. Хотя сами оуказатели она менять не будет.

Поэтому
Код: Выделить всё
... ByRef ppOptions As IntPtr) As Integer

Код: Выделить всё
Dim pOpts As GCHandle = System.Runtime.InteropServices.GCHandle.Alloc(opts, GCHandleType.Pinned)
res = AVISaveOptions(0,3, 1, ps, GCHandle.op_explicit(pOpts))
pOpts.Free
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 91

    TopList