Страница: 1 | 2 | 3 |
Вопрос: Неясные глюки
Добавлено: 11.08.04 17:53
Автор вопроса: NovichoK
Ответы
Всего ответов: 34
Номер ответа: 16
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #16
Добавлено: 13.08.04 00:13
>Iczelion'а, урок 13
- Довольно скундо. Но всё же вроде удалось кое что почерпать.
А ну ка проверь как я понял.
Значит когда нам нужно получить данные из файла нужно использовать MapViewOfFile, котрая вернёт указатель, который можно потом использовать как LPSTR (ASCIIZ PTR в PB)?
Во всяком случае у Iczelion'а этот указатель передаётся потом в WriteFile параметром LPCVOID lpBuffer.
Или этот указатель расчитан только на файловые API?
Номер ответа: 17
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #17
Добавлено: 13.08.04 08:51
Нет, ну если тебе надо считать весь файл, то нет смысла его считывать построчно. Примерно
Dim Stroka As Long
Dim hFile As Byte
hFile = FreeFile
Open FileName For Input As hFile
Stroka = Input(LOF(hFile), hFile)
Close hFile
'MsgBox Stroka
Ежели нужно разбить построчно - можно использовать Split.
Номер ответа: 18
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #18
Добавлено: 13.08.04 11:59
Несколько мутно.
MapViewOfFile отображает файл на память и возвращает куда она это сделала. Причем это явно не ASCIIZ. А WriteFile Iczelion использует по отношению не к маппированному файлу:
invoke CreateFileMapping, hFileRead,NULL,PAGE_READONLY,0,0,NULL
mov hMapFile,eax
а WriteFile здесь:
invoke WriteFile,hFileWrite,pMemory,eax,ADDR SizeWritten,NULL
Причем hFileWrite нигде не маппируется.
С указателем можно работать как и с обычной памятью, такие "операции с памятью" Винда будет преобразовывать в операции ввода/вывода из/в файл(а).
Номер ответа: 19
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #19
Добавлено: 13.08.04 12:17
MapViewOfFile, отображает не обязательно файл...
Номер ответа: 20
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #20
Добавлено: 13.08.04 14:17
Sharp,
Ты не внимателен.
invoke MapViewOfFile,hMapFile,FILE_MAP_READ,0,0,0
mov pMemory,eax
Как видишь WriteFile использует указатель pMemory, полученный с помощью MapViewOfFile.
Номер ответа: 21
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #21
Добавлено: 13.08.04 18:16
WriteFile использует адрес памяти для записи в любом случае. В данном случае он использует указатель на отмаппированный в память файл. А MapViewOfFile отображает в память все, что может быть названо файлом с той или иной степенью натяжки Не сказано ведь, что дисковый файл.
Номер ответа: 22
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #22
Добавлено: 13.08.04 18:49
Ладно, похоже что ты сам в этом не разбирался.
Но раз я уже начал копать, то наверное прекращать нерационально.
С WriteFile и так всё понятно. Это файловая функция и проблем с ней по идее быть не должно.
А как на счёт строковых функций? Если я захочу например найти последовательность байт?
Сработает ли что то типа сунуть pMemory в ESI, а искомую строку в EDI и потом в цикле выполнить CMPS?
Именно про строковые API я и спрашивал. Как думаешь сработают?
Номер ответа: 23
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #23
Добавлено: 13.08.04 18:58
Я, наверно, не так понял твой вопрос? Программисту абсолютно не нужно знать, отмаппирован ли файл в память или просто считан стандартными средствами, он может работать с памятью, как и обычно - единственное отличие состоит в том, что запись в файл при записи в память идет сразу.
Номер ответа: 24
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #24
Добавлено: 13.08.04 19:22
Я правильно понял? Значит при маппировании файла он как бы превращается в память и любая функция работы с памятью его указатель обработает корректно?
Номер ответа: 25
Автор ответа:
shuffle
Администратор
ICQ: 201502381
Вопросов: 15
Ответов: 737
Профиль | | #25
Добавлено: 14.08.04 05:40
>Значит при маппировании файла он как бы превращается в память и любая
>функция работы с памятью его указатель обработает корректно?
Именно так. Цитата из книги Стивена Романа:
"Windows способна интерпретировать файл на диске так, как если бы он
был частью памяти. Для этого часть файла отображается на область
адресного пространства виртуальной памяти. Связанные с памятью
API-функции, подобные CopyMemory, могут затем использоваться для
просмотра и изменения содержимого файла на диске. Такой файл
называется отображаемым в память (memory-mapped file)."
Номер ответа: 26
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #26
Добавлено: 14.08.04 11:25
<=Alex=>,
Привет. А как насчёт ссылки на эту книгу?
Номер ответа: 27
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #27
Добавлено: 14.08.04 11:27
Люди, а давайте модуль напишем с мапингом. Ведь если реально повысить скорость работы с большими файлами, то ему цены не будет.
Номер ответа: 28
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #28
Добавлено: 14.08.04 12:21
А зачем, проще чем на АПИ все-равно не сделаешь, т.к. все параметры "нужные", к примеру строка object name, или буфер...
Да там а если еще и пару файлов нужно отразить, это надо будет еще с массивом "настроек" возиться...
Номер ответа: 29
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #29
Добавлено: 14.08.04 12:55
Нет, на API не проще. Проще как раз на VB.
Номер ответа: 30
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #30
Добавлено: 14.08.04 15:51
Я давно собирался сделать типа fopen, чтобы не писать эти корявые Open For As, но какие-то проблемы возникли с ресайзом памяти для записи. Но если делать только для чтения/записи с фиксированным размером, то можно устроить.