Страница: 1 | 2 |
Может мне кто подскажет!!! Как работать с указателями в vb.net! Мне нужно использовать API-шную функцию BOOL ReadFile( Дескриптор получить просто, а вот остальное??? В мсдн-ке есть пример использования класса StringBuilder для этой функции, но мне нужно считывать побайтово (файл очень большой). И еще,
Использование FileStream дает для 100 метрового файла время ститывания 12 секунд, использование родной функции FileGet дает 7 секунд, Api -шная функция считывает за 2 секунды, но мне неохота переводить из Char в Byte, да и времени это займет очень много. Можно ли как нибудь средствами FrameWorka получить указатель на массив байтов или нет??? И для чего тогда существует тип IntPtr??? Спасибо, я разобрался! Оказываеться методы фреймвека работают не сколько не медленнее апишных, просто нужно считывать информцию не в цикле а сразу большое количесто байт!! Но все равно у меня вопрос на будущее - можно ли какими-нибудь средствами получить указатель на массив или переменную??? Разве Marshal не дает такой возможности??? Работа с указателями в .Net очень легко реализуется через класс Marshal. Методами .WriteXXX, .ReadXXX и .Copy (для структур есть функции .PtrToStructure и .StructureToPtr, вторая из которых даёт прямой указатель на структуру). Если нужно передать указатель на что-либо в функцию API - ByRef в обьявлении функции автоматически даст такой эффект. Соответственно массив просто передаётся по ссылке и функция API получает указатель на его нулевой элемент (что и требуется). При работе с указателями типа IntPtr в .Net могут возникнуть проблемы с Garbage Сollector'ом. Но почему тогда у меня работает такое - Значение массива передается по значению, тем не менее все работает и функция возращает True, зато если пытаться передать по сслылке, ByRef lpBuffer() As Byte, _ то возникает исключение? Кто может объяснить?? 2sania-tngf: Я немного неясно выразился. При передаче через ByRef действительно передаётся указатель. Но в переменной типа "массив" уже хранится указатель - указатель на нулевой элемент этого массива. Если весь массив ( например, как lpBuffer() ) передавать через ByRef - получится указатель на указатель. По этому и работает передача целого массива через ByVal - реально в код C++ по значению передаётся указатель на его нулевой элемент. Можно передать этот указатель и другим способом - передать ByRef нулевой элемент массива ( lpBuffer(0) ). Вот и вся сложность. An unhandled exception of type 'System.ExecutionEngineException' occurred in project_avo.exe Вот такое исключение возникает!!! Почему?
Вопрос: Указатели и API
Добавлено: 22.04.04 07:48
Автор вопроса: sania-tngf
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped);
lpNumberOfBytesRead это не порядковый номер байта с которого считывать а указатель. Кто мне может помочь и объяснить че к чему.
Ответы
Всего ответов: 16
Номер ответа: 1
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #1
Добавлено: 22.04.04 10:54
Во-первых, указатели в VB .Net не приемлимы... Они только в unmanaged
VC++ .Net есть и, наверное, в unmanaged вставках C#.
Во-вторых, почему бы для чтения файлов не использовать штатные
средства (в данном случае - классы FileStream и BinaryReader из
пространства имён System.IO)?
Номер ответа: 2
Автор ответа:
Maxik
Вопросов: 58
Ответов: 201
Профиль | | #2
Добавлено: 22.04.04 10:55
А FileStream разве не подходит?
Там можно установить позицию считывания(не указатель), и прочесть в
буфер.
Номер ответа: 3
Автор ответа:
sania-tngf
Вопросов: 16
Ответов: 21
Профиль | | #3
Добавлено: 22.04.04 12:05
Номер ответа: 4
Автор ответа:
Maxik
Вопросов: 58
Ответов: 201
Профиль | | #4
Добавлено: 22.04.04 13:49
Что значит "из char в byte"???
FileStream работает с массивом байтов!
Номер ответа: 5
Автор ответа:
sania-tngf
Вопросов: 16
Ответов: 21
Профиль | | #5
Добавлено: 22.04.04 15:59
Номер ответа: 6
Автор ответа:
Maxik
Вопросов: 58
Ответов: 201
Профиль | | #6
Добавлено: 22.04.04 19:31
Указателей в .net нет! Маршалинг служит для взаимодействия между managed
и unmanaged кодом. IntPtr, кажется, заменяет указатель для unmanaged
кода, но указатель на переменную получить точно нельзя.
Номер ответа: 7
Автор ответа:
Андрей Щёкин [darxeth]
ICQ: 161560107
Вопросов: 9
Ответов: 52
Web-сайт:
Профиль | | #7
Добавлено: 23.04.04 01:46
Номер ответа: 8
Автор ответа:
sania-tngf
Вопросов: 16
Ответов: 21
Профиль | | #8
Добавлено: 23.04.04 06:46
Номер ответа: 9
Автор ответа:
Maxik
Вопросов: 58
Ответов: 201
Профиль | | #9
Добавлено: 23.04.04 09:44
[darXeth]
А я и не знал. Намотаю на ус.
Номер ответа: 10
Автор ответа:
Андрей Щёкин [darxeth]
ICQ: 161560107
Вопросов: 9
Ответов: 52
Web-сайт:
Профиль | | #10
Добавлено: 23.04.04 12:08
Номер ответа: 11
Автор ответа:
Maxik
Вопросов: 58
Ответов: 201
Профиль | | #11
Добавлено: 23.04.04 13:48
Массив это referencetype - в любом случае передается по ссылке.
Но почему по ByRef не работает не пойму.
Напиши, какое исключение возникает.
Номер ответа: 12
Автор ответа:
sania-tngf
Вопросов: 16
Ответов: 21
Профиль | | #12
Добавлено: 23.04.04 14:35
Мне бы тоже хотелось знать какое исключени - просто говорит что возникло исключение в таком то проекте и все!!!
Номер ответа: 13
Автор ответа:
Maxik
Вопросов: 58
Ответов: 201
Профиль | | #13
Добавлено: 23.04.04 15:36
В Additional information написано.
Номер ответа: 14
Автор ответа:
sania-tngf
Вопросов: 16
Ответов: 21
Профиль | | #14
Добавлено: 23.04.04 16:45
Номер ответа: 15
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #15
Добавлено: 23.04.04 17:50
Насколько понял во время курения MSDN, это что-то типа фатальной
неопознаваемой ошибки ядра CLR...