Надо в файле перейти на определенную позицию, следовательно я пишу Код (Text): invoke SetFilePointer, hFile, Distance, 0, FILE_BEGIN после выполнения в eax FFFFFFFF, то есть указатель не перемещен. В чем тут проблема на си и дельфях все работает. Разъясните в чем не прав. Может можно как-нибудь по другому сделать?
Скорее всего что-то с hFile или Distance за пределы смотрит If the function fails and lpDistanceToMoveHigh is NULL, the return value is 0xFFFFFFFF. To get extended error information, call GetLastError.
Distance за пределы точно не смотрит, hFile получил так(это отрывок): Код (Text): invoke CreateFile, addr buf, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0 .if eax != INVALID_HANDLE_VALUE mov hFile, eax invoke CreateFileMapping, hFile, 0, PAGE_READONLY, 0, 0, 0 .if eax!=0 mov hFileMapping, eax invoke MapViewOfFile, hFileMapping, FILE_MAP_READ, 0, 0, 0 .if eax!=0 mov p,eax invoke SetFilePointer, hFile, Distance, 0, FILE_BEGIN .endif .endif .endif где hFile dd ? Может вместо hFile hFileMapping надо, но всеравно 0xFFFFFFFF, повторюсь в си и дельфях все по последовательности также(с hFile) и работает.
А как с памятью работать? т.е. так что ли: Код (Text): mov edi, p add edi, Distance assume edi: ptr , где p из предыдущего фрагмента? Да и просто интересно а че SetFilePointer не работает. В отладчике смотрел там передается функции все правильно.
Julius Проверил еще раз: я же говорю - все правильно. asmfan Поднял в принципе все понятно, да и знаком я уже с этим немного. Но надо через SetFilePointer. Всем А SetFilePointer все равно не работает. И еще хотите прикол? Функции CreateFile, WriteFile, ReadFile тоже не работают в последнем блоке Код (Text): .if eax!=0 .endif Проверял в отладчике управление на этот блок передается. Написал процедурку открывающую существующий файл. Дважды вызываю её. До DlgProc все открывается(выше обозначенный кусок кода находится в ней), а в указанном блоке нифига. Так в чем же проблема? Все делаю правильно - по науке.
kosfz Может не работать как раз из-за MMF. Пока файл отображен в память, некоторые операции с его оригинальным хендлом зачастую обламываются. К примеру, GetFileSize иногда не работает.
Я нашел то, из-за чего эта ерунда. До вызова SetFilePointer и др. функций у меня присутствовало вот такое: Код (Text): mov sys,ax invoke wsprintf,addr resbuf,addr fmts,sys после изменения на Код (Text): mov sys,ax invoke wsprintf,addr resbuf,addr fmts,addr sys все заработало(sys dw ?). У меня теперь следующие вопросы: 1) Нигде вроде не говориться, что параметр помещаемый в wsprintf должен быть dword, а не word. И что к word или dword в wsprintf addr надо, я что-то нигде не встречал. Как же правильно, ведь работа по преобразованию выполнялась и ошибок не выдавало? 2) Как эта фигня могла повлиять на другие функции SetFilePointer, CreateFile, ReadFile и не сказалась на wsprintf, SetDlgItemText и др. ? Объясните пожалуйста.
kosfz Параметры для всех API должны быть dword чтобы значение esp всегда было кратно 4м. Не надо. addr возвращает указатель на sys, а нужно, видимо, само значение sys. Код (Text): movzx edx,ax mov sys,ax invoke wsprintf,addr resbuf, addr fmts,edx Причём invoke всё равно не умеет обращаться с 16-битными параметрами. Так что имеем 2 бага в одном. Это серьёзный баг, а вовсе не фигня