Как правильно передать адреса переменных в DLL ? Хелп.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
xccv
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 2
Зарегистрирован: 07.07.2008 (Пн) 10:44

Как правильно передать адреса переменных в DLL ? Хелп.

Сообщение xccv » 07.07.2008 (Пн) 11:09

Здравствуйте, помогите пожалуйста прикрутить к VB чужую DLL'ку (насколько я знаю написаную на C++).

Собственно хочу поюзать: WpeSpy.dll
В DLL'ке есть функция setfilter, в неё передаются 6 параметров:
Код: Выделить всё
1. Pointer  Paramter0: 0 (0x0)
2. Pointer  Paramter1: 4918724 (0x4B0DC4)
3. Pointer  Paramter2: 4919224 (0x4B0FB8)
4. Pointer  Paramter3: 4919724 (0x4B11AC)
5. Pointer  Paramter4: 4920724 (0x4B1594)
6. Pointer  Paramter5: 4294901765 (0xFFFF0005)

1: параметр id фильтра (1 байт)
2-5: адресса массивов (4 байта, >> массивы по 500 байт)
6: флаг (8 байт)

Думаю моя проблема заключается в том, что я не могу в 2-5 параметры правильно передать адреса своих массивов..

Код: Выделить всё
Option Explicit

Private Declare Function SetFilter Lib "wpespy" (q1 As Byte, q2 As Long, q3 As Long, q4 As Long, q5 As Long, q6 As Double) As Long

Function Main()
  Dim w1(0 To 499) As Byte
  Dim w2(0 To 499) As Byte
  Dim w3(0 To 499) As Byte
  Dim w4(0 To 499) As Byte
  Dim x As Long

  x = SetFilter(0, VarPtr(w1(0)), VarPtr(w2(0)), VarPtr(w3(0)), VarPtr(w4(0)), &HFFFF0005)
End Function


Получаю ошибку: "Инструкция по адресу '0x10001071' обратилась к памяти по адресу '0x35073d00'. Память не может быть 'written'."

Не бейте если что не так делаю :) , я новичек в vb. Заранее спасибо.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 07.07.2008 (Пн) 11:58

Нужно передавать первый элемент массива.
Код: Выделить всё
x = SetFilter(0, w1(0), w2(0), w3(0), w4(0), &HFFFF0005)
Лучший способ понять что-то самому — объяснить это другому.

xccv
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 2
Зарегистрирован: 07.07.2008 (Пн) 10:44

Сообщение xccv » 07.07.2008 (Пн) 12:05

Byref argument type mismatch

Изминил:

Код: Выделить всё
Private Declare Function SetFilter Lib "wpespy" (q1 As Byte, ByRef q2 As Long, ByRef q3 As Long, ByRef q4 As Long, ByRef q5 As Long, q6 As Double) As Long


Такая же ошибка.. Получилось скомпилить при:

Код: Выделить всё
x = SetFilter(0, ByVal w1(0), ByVal w2(0), ByVal w3(0), ByVal w4(0), &HFFFF0005)


Ошибка: "Инструкция по адресу '0x10001071' обратилась к памяти по адресу '0x0000001e'. Память не может быть 'read'." :(

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 07.07.2008 (Пн) 12:21

Между q2 As Long и ByRef q2 As Long нет никакой разницы. ByRef используется по умолчанию. Попробуй ByVal, потом q2 и т.д. As Byte. У тебя же байтовые массивы.
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Visual Basic 1–6

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

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

    TopList