Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: basicproduction.nm.ru
 Профиль | | #1
Добавлено: 30.06.05 15:41
А если
CopyMemory ByVal StrPtr(sInfo), ByVal mAdress, BlockSize

Ответить

Номер ответа: 2
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #6
Добавлено: 30.06.05 15:55
Наверное там нужно ByVal StrPtr(sInfo). Это зависит от того как объявлена ReadFile.

Ответить

Номер ответа: 7
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #7
Добавлено: 30.06.05 16:00
Память для строки должна быть выделена предварительно. Поставь sInfo = Space(BlockSize) перед вызовом API.

Ответить

Номер ответа: 8
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #8
Добавлено: 30.06.05 19:04
у мня получилось так

    ;Dim 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)

Ответить

Страница: 1 |

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



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