std+CreateFile: почему вылетает?

Discussion in 'WASM.BEGINNERS' started by Alexey2005, Jul 19, 2006.

  1. Alexey2005

    Alexey2005 New Member

    Blog Posts:
    0
    Joined:
    Jan 9, 2006
    Messages:
    19
    Location:
    Russia
    Никак не могу понять: почему при выполнении CreateFile, например,
    invoke CreateFile,szXX,GENERIC_READ or GENERIC_WRITE,0,0,\
    OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0

    программа вылетает с сообщением о переполнении стека, если хотя бы раз перед вызовом CreateFile встречалась команда std?
    И как можно устранить эту проблему? Что же, получется, в Windows-программах цепочки символов можно только в "прямом" направлении обрабатывать, а в обратном - никак?
     
  2. Quantum

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

    Blog Posts:
    0
    Joined:
    Jan 6, 2003
    Messages:
    3,143
    Location:
    Ukraine
    А что мешает добавить cld перед вызовом?
     
  3. Bill_Prisoner

    Bill_Prisoner New Member

    Blog Posts:
    0
    Joined:
    May 4, 2005
    Messages:
    238
    Alexey2005
    Эту проблему решить нельзя, т.к. это соглашение о вызовах функций Win API - callback функции должны сохранять регистры ebx,esp,ebp,esi,edi и флаг напрвления. Теже правила и при вызове API функций. Они также сохраняют регистры. И одно еще одно правило - направление должно быть положительным. В windows можно работать в любом направлении обработки цепочек, просто до вызова любой API флаг направления нужно делать положительным.
     
  4. Quantum

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

    Blog Posts:
    0
    Joined:
    Jan 6, 2003
    Messages:
    3,143
    Location:
    Ukraine
    Bill_Prisoner
    Если сохранение esp подразумевает соглашение stdcall, то есть одно исключение - user32!wsprintf.
     
  5. Bill_Prisoner

    Bill_Prisoner New Member

    Blog Posts:
    0
    Joined:
    May 4, 2005
    Messages:
    238
    Quantum
    Да-да, вы совершенно правы!!!
     
  6. IceStudent

    IceStudent Active Member

    Blog Posts:
    0
    Joined:
    Oct 2, 2003
    Messages:
    4,300
    Location:
    Ukraine
    Quantum
    Имеется ввиду сохранение esp внутри колбэка.