dll и string array

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

dll и string array

Сообщение blackmac » 16.02.2004 (Пн) 19:27

Поможите
как устроен массив стрингов в VB
объявляю

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

Dim mass() As String

mass(1) = "zzzzzzzzzz"
mass(2) = "xxxxxxxxxx"
mass(3) = "cccccccccc"
mass(4) = "vvvvvvvvvv"
mass(5) = "bbbbbbbbbb"


пишу dll на с
Код: Выделить всё
extern "C" __declspec( dllexport ) int __stdcall razborf(char **arr)
{
   int g;

   for(g=0; g<4; g++) {
     sprintf(str1, "%d", (*arr)++ );
     MessageBox(0, str1, "temp2", 0);
     strcpy(*arr,  "My String")   
}
}


при попытке записать по какому-либо адресу я вываливаюсь в ошибку что память не может быть written

если эту функцию из С вызывать - все еллоупуки

<Sergey>
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 08.02.2004 (Вс) 3:25
Откуда: Одесса

Сообщение <Sergey> » 17.02.2004 (Вт) 4:27

Используй вместо массива строк двумерный байтовый массив.
Проблемы у тебя возникают потому, что VB, если ты создал строковый массив, по адресу массива будет хранить не сами строки а другие адреса (по 4 байта на адрес каждого элемента массива).

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

Сообщение GSerg » 17.02.2004 (Вт) 11:29

** - это как раз указатель на указатель...
Напиши, как ты вызываешь эту функцию из VB.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

blackmac
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 16.02.2004 (Пн) 18:50

Сообщение blackmac » 17.02.2004 (Вт) 13:22

Код: Выделить всё
Private Declare Function razborf Lib "AMServ.dll" Alias "_razborf@4" (ByRef mass As String) As Long

потом инициирую массив
Dim mass() As String

mass(1) = "zzzzzzzzzz"
mass(2) = "xxxxxxxxxx"
mass(3) = "cccccccccc"
mass(4) = "vvvvvvvvvv"
mass(5) = "bbbbbbbbbb"

а потом вызываю функцию
j = razborf(mass(0))

потом печатаю результат
Form1.Text1.Text = mass(1)
....
Form1.Text4.Text = mass(4)
Form1.Text5.Text = mass(5)


<Sergey>
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 08.02.2004 (Вс) 3:25
Откуда: Одесса

Сообщение <Sergey> » 18.02.2004 (Ср) 4:52

попробуй объявить строковый массив фиксированной длины
Dim str(5) As String * 50. В этом случае по адресу массива будут храниться сами строки.
а в C-ишную функцию можно добавить еще один аргумент - длина строки.
И когда будешь передавать строки не забудь в конце каждой добавить нулевой символ.

И еще один момент если массив начинается с первого элемента, то и в функцию нужно передавать его, а не нулевой.


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 8

    TopList