Вопрос про SetFilePointer

Тема в разделе "WASM.BEGINNERS", создана пользователем kosfz, 17 июл 2006.

  1. kosfz

    kosfz New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    45
    Адрес:
    Russia
    Надо в файле перейти на определенную позицию, следовательно я пишу
    Код (Text):
    1. invoke SetFilePointer, hFile, Distance, 0, FILE_BEGIN
    после выполнения в eax FFFFFFFF, то есть указатель не перемещен. В чем тут проблема на си и дельфях все работает. Разъясните в чем не прав. Может можно как-нибудь по другому сделать?
     
  2. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Скорее всего что-то с hFile или Distance за пределы смотрит ;)
    If the function fails and lpDistanceToMoveHigh is NULL, the return value is 0xFFFFFFFF. To get extended error information, call GetLastError.
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Отладчиком пользуйся, а не телепатией.
     
  4. kosfz

    kosfz New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    45
    Адрес:
    Russia
    Distance за пределы точно не смотрит, hFile получил так(это отрывок):
    Код (Text):
    1. invoke CreateFile, addr buf, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0
    2. .if eax != INVALID_HANDLE_VALUE
    3. mov hFile, eax
    4. invoke CreateFileMapping, hFile, 0, PAGE_READONLY, 0, 0, 0
    5. .if eax!=0
    6. mov hFileMapping, eax
    7. invoke MapViewOfFile, hFileMapping, FILE_MAP_READ, 0, 0, 0
    8. .if eax!=0
    9. mov p,eax
    10. invoke SetFilePointer, hFile, Distance, 0, FILE_BEGIN
    11. .endif
    12. .endif
    13. .endif
    где hFile dd ? Может вместо hFile hFileMapping надо, но всеравно 0xFFFFFFFF, повторюсь в си и дельфях все по последовательности также(с hFile) и работает.
     
  5. kosfz

    kosfz New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    45
    Адрес:
    Russia
    IceStudent
    Ща попробую с отладчиком.
     
  6. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    А зачем SetFilePointer ? :) Здесь надо работать как с памятью.
     
  7. kosfz

    kosfz New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    45
    Адрес:
    Russia
    А как с памятью работать? т.е. так что ли:
    Код (Text):
    1. mov edi, p
    2. add edi, Distance
    3. assume edi: ptr
    , где p из предыдущего фрагмента?
    Да и просто интересно а че SetFilePointer не работает. В отладчике смотрел там передается функции все правильно.
     
  8. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Подымай Memory Mapped Files (aka MMF)
     
  9. Julius

    Julius New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2003
    Сообщения:
    42
    Значит не правильно, потому что все должно работать. Проверь еще раз...
     
  10. kosfz

    kosfz New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    45
    Адрес:
    Russia
    Julius
    Проверил еще раз: я же говорю - все правильно.
    asmfan
    Поднял в принципе все понятно, да и знаком я уже с этим немного. Но надо через SetFilePointer.
    Всем
    А SetFilePointer все равно не работает. И еще хотите прикол? Функции CreateFile, WriteFile, ReadFile тоже не работают в последнем блоке
    Код (Text):
    1. .if eax!=0
    2. .endif
    Проверял в отладчике управление на этот блок передается. Написал процедурку открывающую существующий файл. Дважды вызываю её. До DlgProc все открывается(выше обозначенный кусок кода находится в ней), а в указанном блоке нифига. Так в чем же проблема? Все делаю правильно - по науке.
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    kosfz
    Может не работать как раз из-за MMF. Пока файл отображен в память, некоторые операции с его оригинальным хендлом зачастую обламываются. К примеру, GetFileSize иногда не работает.
     
  12. kosfz

    kosfz New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    45
    Адрес:
    Russia
    Я нашел то, из-за чего эта ерунда. До вызова SetFilePointer и др. функций у меня присутствовало вот такое:
    Код (Text):
    1. mov sys,ax
    2. invoke wsprintf,addr resbuf,addr fmts,sys
    после изменения на
    Код (Text):
    1. mov sys,ax
    2. invoke wsprintf,addr resbuf,addr fmts,addr sys
    все заработало(sys dw ?). У меня теперь следующие вопросы:
    1) Нигде вроде не говориться, что параметр помещаемый в wsprintf должен быть dword, а не word. И что к word или dword в wsprintf addr надо, я что-то нигде не встречал. Как же правильно, ведь работа по преобразованию выполнялась и ошибок не выдавало?
    2) Как эта фигня могла повлиять на другие функции SetFilePointer, CreateFile, ReadFile и не сказалась на wsprintf, SetDlgItemText и др. ?
    Объясните пожалуйста.
     
  13. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    kosfz
    Параметры для всех API должны быть dword чтобы значение esp всегда было кратно 4м.

    Не надо. addr возвращает указатель на sys, а нужно, видимо, само значение sys.
    Код (Text):
    1. movzx edx,ax
    2. mov sys,ax
    3. invoke wsprintf,addr resbuf, addr fmts,edx
    Причём invoke всё равно не умеет обращаться с 16-битными параметрами. Так что имеем 2 бага в одном.

    Это серьёзный баг, а вовсе не фигня :)
     
  14. kosfz

    kosfz New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    45
    Адрес:
    Russia
    Quantum
    Спасибо за разъяснения теперь понятно.
    Всем
    Спасибо за помощь.