Страница: 1 |
Страница: 1 |
Вопрос: Чтение, запись
Добавлено: 30.06.05 15:35
Автор вопроса: Mihalыch | ICQ: 373-509-101
Посмотрите два фрагмента кода:
Private Sub fWrite()
hPut = CreateFile(sPath, GENERIC_WRITE, 0, ByVal 0, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, 0)
'открываем файл для записи
sInfo = "|" & s_1 & "|" & s_2 & "|" & Space(576 - Len(s_1) - Len(s_2) - 3)
'формируем строку, её длина должна быть 576
SetFilePointer hPut, Pos, 0, FILE_BEGIN
'устанавливаем позицию для записи
WriteFile hPut, ByVal StrPtr(sInfo), 576, 576, 0
'записываем строку в файл
End Sub
И
Private Sub fRead()
hGet = CreateFile(sPath, GENERIC_READ, 0, ByVal 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, 0)
'открываеь файл для чтения
SetFilePointer hGet, Pos, 0, FILE_BEGIN
'устанавливаем позицию для чтения (она точно известна)
ReadFile hGet, ByVal mAdress, 576, BlockSize, 0
'читаем 576 байт с позиции установленно в предыдущем операторе
sInfo = Space(BlockSize)
'подготавливаем строку
CopyMemory ByVal sInfo, ByVal mAdress, BlockSize
'читаем память
End Sub
Память выделяю так
mAdress = GlobalAlloc(GMEM_FIXED, 3000)
Теперь проблема, если например при записи sInfo = “строка”, то при получении или Виндовс ломится отправлять отчет мелклмягким (это происходит или в момент ReadFile или CopyMemory) или вместо “строка” получаю “с т р о к а” (между символами находится chr(0)). Подскажите что не так делаю?
Ответы
Всего ответов: 8
Номер ответа: 1
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #1
Добавлено: 30.06.05 15:41
А если
CopyMemory ByVal StrPtr(sInfo), ByVal mAdress, BlockSize
Номер ответа: 2
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #2
Добавлено: 30.06.05 15:44
А вообще зачем дополнительное копирование CopyMemory? Почему бы не передать в ReadFile сразу адрес строки?
Номер ответа: 3
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #3
Добавлено: 30.06.05 15:45
Сенкс вам огромных размеров!!!
Номер ответа: 4
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #4
Добавлено: 30.06.05 15:50
CayRax, первый вариант работает, еще раз спасибо, а на счет второго, ты это имел ввиду
ReadFile hGet, StrPtr(sInfo), 576, BlockSize, 0
Попробовал VB закрылся без предупреждения?!
Номер ответа: 5
Автор ответа:
Mihalыch
ICQ: 373-509-101
Вопросов: 56
Ответов: 330
Профиль | | #5
Добавлено: 30.06.05 15:52
Так,
ReadFile hGet, ByVal StrPtr(sInfo), 576, BlockSize, 0
ошибки нет но и строка не заполняется
Номер ответа: 6
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #6
Добавлено: 30.06.05 15:55
Наверное там нужно ByVal StrPtr(sInfo). Это зависит от того как объявлена ReadFile.
Номер ответа: 7
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #7
Добавлено: 30.06.05 16:00
Память для строки должна быть выделена предварительно. Поставь sInfo = Space(BlockSize) перед вызовом API.
Номер ответа: 8
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #8
Добавлено: 30.06.05 19:04
у мня получилось так
 im hGet As Long, sInfo As String, BlockSize As Long
hGet = CreateFile("c:\1.txt", &H80000000, 0, ByVal 0, 3, FILE_FLAG_SEQUENTIAL_SCAN, 0)
'открываеь файл для чтения
SetFilePointer hGet, 0, 0, 0
'устанавливаем позицию для чтения (она точно известна)
sInfo = String$(576, 0)
ReadFile hGet, ByVal sInfo, 576, BlockSize, 0
sInfo = StrConv(sInfo, vbFromUnicode)