Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Указатели и API Добавлено: 22.04.04 07:48  

Автор вопроса:  sania-tngf

Может мне кто подскажет!!! Как работать с указателями в vb.net! Мне нужно использовать API-шную функцию BOOL ReadFile(
   HANDLE hFile,
   LPVOID lpBuffer,
   DWORD nNumberOfBytesToRead,
   LPDWORD lpNumberOfBytesRead,
   LPOVERLAPPED lpOverlapped);

Дескриптор получить просто, а вот остальное??? В мсдн-ке есть пример использования класса StringBuilder для этой функции, но  мне нужно считывать побайтово (файл очень большой).  И еще,
lpNumberOfBytesRead это не порядковый номер байта с которого считывать а указатель. Кто мне может помочь и объяснить че к чему.

Ответить

  Ответы Всего ответов: 16  

Номер ответа: 1
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #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

Использование FileStream дает для 100 метрового файла время ститывания 12 секунд, использование родной функции FileGet дает 7 секунд,  Api -шная функция считывает за 2 секунды, но мне неохота переводить из Char в Byte, да и времени это займет очень много. Можно ли как нибудь средствами FrameWorka получить указатель на массив байтов или нет???  И для чего тогда существует тип IntPtr???

Ответить

Номер ответа: 4
Автор ответа:
 Maxik



Вопросов: 58
Ответов: 201
 Профиль | | #4 Добавлено: 22.04.04 13:49
Что значит "из char в byte"???
FileStream работает с массивом байтов!

Ответить

Номер ответа: 5
Автор ответа:
 sania-tngf



Вопросов: 16
Ответов: 21
 Профиль | | #5 Добавлено: 22.04.04 15:59

Спасибо, я разобрался! Оказываеться методы фреймвека работают не сколько не медленнее апишных, просто нужно считывать информцию не в цикле а сразу большое количесто байт!! Но все равно у меня вопрос на будущее - можно ли какими-нибудь средствами получить указатель на массив или переменную??? Разве Marshal не дает такой возможности???

Ответить

Номер ответа: 6
Автор ответа:
 Maxik



Вопросов: 58
Ответов: 201
 Профиль | | #6 Добавлено: 22.04.04 19:31
Указателей в .net нет! Маршалинг служит для взаимодействия между managed
и unmanaged кодом. IntPtr, кажется, заменяет указатель для unmanaged
кода, но указатель на переменную получить точно нельзя.

Ответить

Номер ответа: 7
Автор ответа:
 Андрей Щёкин [darxeth]



ICQ: 161560107 

Вопросов: 9
Ответов: 52
 Web-сайт: www.livejournal.com/users/darxeth_digital
 Профиль | | #7
Добавлено: 23.04.04 01:46

Работа с указателями в .Net очень легко реализуется через класс Marshal. Методами .WriteXXX, .ReadXXX и .Copy (для структур есть функции .PtrToStructure и .StructureToPtr, вторая из которых даёт прямой указатель на структуру).

Если нужно передать указатель на что-либо в функцию API - ByRef в обьявлении функции автоматически даст такой эффект. Соответственно массив просто передаётся по ссылке и функция API получает указатель на его нулевой элемент (что и требуется).

При работе с указателями типа IntPtr в .Net могут возникнуть проблемы с Garbage Сollector'ом.

Ответить

Номер ответа: 8
Автор ответа:
 sania-tngf



Вопросов: 16
Ответов: 21
 Профиль | | #8 Добавлено: 23.04.04 06:46

Но почему тогда у меня работает такое -

Overloads Declare Function ReadFile Lib "kernel32" Alias "ReadFile" ( _

ByVal hFile As HandleRef, _

ByVal lpBuffer() As Byte, _

ByVal nNumberOfBytesToRead As Integer, _

ByRef lpNumberOfBytesRead As Integer, _

ByVal lpOverlapped As Integer) As Integer

Значение массива передается по значению, тем не менее все работает и функция возращает True, зато если пытаться передать по сслылке,

ByRef lpBuffer() As Byte, _ то возникает исключение? Кто может объяснить??

Ответить

Номер ответа: 9
Автор ответа:
 Maxik



Вопросов: 58
Ответов: 201
 Профиль | | #9 Добавлено: 23.04.04 09:44
[darXeth]
А я и не знал. Намотаю на ус.

Ответить

Номер ответа: 10
Автор ответа:
 Андрей Щёкин [darxeth]



ICQ: 161560107 

Вопросов: 9
Ответов: 52
 Web-сайт: www.livejournal.com/users/darxeth_digital
 Профиль | | #10
Добавлено: 23.04.04 12:08

2sania-tngf:

Я немного неясно выразился. При передаче через ByRef действительно передаётся указатель. Но в переменной типа "массив" уже хранится указатель - указатель на нулевой элемент этого массива. Если весь массив ( например, как lpBuffer() ) передавать через ByRef - получится указатель на указатель.

По этому и работает передача целого массива через ByVal - реально в код C++ по значению передаётся указатель на его нулевой элемент. Можно передать этот указатель и другим способом - передать ByRef нулевой элемент массива ( lpBuffer(0) ).

Вот и вся сложность.

Ответить

Номер ответа: 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

An unhandled exception of type 'System.ExecutionEngineException' occurred in project_avo.exe

Вот такое исключение возникает!!! Почему?

Ответить

Номер ответа: 15
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #15
Добавлено: 23.04.04 17:50
Насколько понял во время курения MSDN, это что-то типа фатальной
неопознаваемой ошибки ядра CLR...

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам