VB6 + CPP

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

VB6 + CPP

Сообщение Acca1 » 19.10.2007 (Пт) 21:16

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

Итак задача:
Пишу программу на VB6. В ней появилась необходимость быстрого чтения бинарных файлов. Решил само чтение реализовать в Dll, написанной на с++, а результат ее работы - здоровенный одномерный массив - передавать обратно в VB.

Решил действовать по следующему алгоритму:
Создаем массив размерности n,
Передаем его в качестве аргумента на вход в ту самую функцию из dll.

Вот пробный код функции из DLL:

short WINAPI ReadData(short p[5], short out){
out = p[0];
return out;
}

Пробный код на VB:

Private Declare Function ReadData Lib "Project1.dll" (ByRef Arr() As Integer, ByRef out As Integer) As Integer
Dim arr(5) As Integer
Dim out As Integer

For i = 0 To 5
arr(i) = Rnd * 100
Next

Debug.Print ReadData(arr(), out)

Возвращает - какую-то несуразицу вроде "-3048"

Как быть?

Acca1
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 05.12.2006 (Вт) 22:24

Сообщение Acca1 » 19.10.2007 (Пт) 21:19

И вообще как оказалось изменение аргументов функции в теле функции никак на результате в VB не отображается :(

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 19.10.2007 (Пт) 21:36

Я не понял, а зачем это делать на C++, если VB вполне быстро читает данные из файла в массив байт?

Код: Выделить всё
Dim hFile As Long, Data() As Byte
hFile=FreeFile()
Open "filename.ext" For Binary As hFile
ReDim(Data(LOF(hFile)-1)
Get hFile,,Data
Close hFile


А вообще, сишную функцию надо объявить так:

Код: Выделить всё
extern "C" void _stdcall _declspec(dllexport) ReadData(char *pData,int DataLen)
{
};

А на VB задекларировать так:
Код: Выделить всё
Declare Function ReadData Lib "libname" Alias "_ReadData@8" (Data As Any, ByVal DataLen As Long)

А вызывать:
Код: Выделить всё
Dim Arr(6) As Byte
Изображение

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 19.10.2007 (Пт) 22:10

А ещё можно размапливать файл, а потом указатель на проекцию файла подсовывать как адрес первого элемента массива. Не обошлось без хитрых колдунств конечно, но вполне нормально работало, и что самое главное быстро. Если надо могу код кинуть...
Подпись проходит рефакторинг

Acca1
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 05.12.2006 (Вт) 22:24

Сообщение Acca1 » 19.10.2007 (Пт) 22:34

Спасибо за ответ.
Дело в том, входные файлы могут достигать нескольких сотен мегабайт, число элементов в массиве - очень велико. Боюсь, что VB не будет достаточно тороплив для таких объемов.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 19.10.2007 (Пт) 22:41

Маппинг это не вб. Это механизм который сама операционка использует для загрузки исполняемых файлов в память например...
Подпись проходит рефакторинг

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

Сообщение Viper » 20.10.2007 (Сб) 6:29

Да, юзай проецирования файлов в память, в кирпичах есть решение. Работает все очень шустро
Весь мир матрица, а мы в нем потоки байтов!

Acca1
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 05.12.2006 (Вт) 22:24

Сообщение Acca1 » 20.10.2007 (Сб) 10:09

Пардон, а что есть кирпичи? :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.10.2007 (Сб) 10:14

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 20.10.2007 (Сб) 16:21

Ещё раз повторюсь - VB сам шустро читает. А вот с проецированием аккуратней - можно превысить лимит адресного пространства.
Изображение

Acca1
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 05.12.2006 (Вт) 22:24

Сообщение Acca1 » 20.10.2007 (Сб) 19:16

Всем спасибо за помощь! Удалось сделать фукцию, как вы советовали, работает довольно быстро!


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

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

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

    TopList  
cron