Ошибки при вызове функций WinAPI

Тема в разделе "WASM.BEGINNERS", создана пользователем Zhelezovsky, 24 окт 2006.

  1. Zhelezovsky

    Zhelezovsky Member

    Публикаций:
    0
    Регистрация:
    24 окт 2006
    Сообщения:
    39
    Всем привет.
    Ввел в свою прогу процедуру, дополняющую строку в конце слэшем для формирования правильного пути
    доступа. После этого она начала рушиться.
    Процедура:
    FinalizeBySlash proc
    mov edi, offset szTextBuf
    cld
    xor eax, eax
    mov ecx, eax
    dec ecx
    repne scasb
    dec edi
    dec edi
    mov al, byte ptr [edi]
    .IF al=="\"
    ret
    .ENDIF
    inc edi
    mov al, "\"
    mov byte ptr [edi], al
    inc edi
    xor ax, ax
    mov byte ptr [edi], al
    invoke MessageBox, hMainForm, ADDR szTextBuf, ADDR wintitle, MB_OK or MB_ICONSTOP
    ret
    FinalizeBySlash endp
    Ошибка происходит при вызове функции MessageBox. Если её убрать, то прога вылетает, как только встречает
    другую API-функцию уже после возврата из процедуры (это CallWindowProc). Тип ошибок во всех случаях - ошибка доступа к памяти. Сегментные регистры замешаны быть не должны - насколько я знаю, Windows их настраивает сама.
    В чём же дело???
     
  2. Demon666

    Demon666 New Member

    Публикаций:
    0
    Регистрация:
    19 май 2006
    Сообщения:
    99
    Zhelezovsky
    Этот код правильно написан! стопудофф!
    Ошибка формируется до вызова процедуры!

    P. S.
    Воспользуйся отладчиком (OllyDbg)

    [Добавил]
    Увеличь буфер szTextBuf на один байт, может, трет какие-то важные значения!
     
  3. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Zhelezovsky
    Полный код в студию.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Zhelezovsky
    Возможно забыл сохранить\восстановить edi: uses edi или push edi + pop edi

    PS: хотя на MessageBox edi не должен влиять... Скорее всего дело в szTextBuf (или замык.нуля нет или наоборот нуль в первой позиции - и то и другое может приводить к затиранию соседних переменных)
     
  5. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    leo
    Ага, я тоже так сначала подумал :)

    Наверно, автор уже сам нашёл ошибку и стыдится выкладывать свой код :)
     
  6. koderr

    koderr New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    205
    Zhelezovsky
    У меня твой код работает нормально, видимо, причина в другом. У меня похожая ошибка была когда после std не сбрасывал DF.
     
  7. Zhelezovsky

    Zhelezovsky Member

    Публикаций:
    0
    Регистрация:
    24 окт 2006
    Сообщения:
    39
    Благодарю всех за желание помочь. Я действительно нашёл ошибку.
    Буфер - это он. Он был объявлен следующим образом:
    szTextBuf db "D:\_SETUP_\_setup_\Update\WinXP\Обновления", 0, 0 dup (256)
    Следом шёл адрес старой оконной процедуры поля edit:
    OldWndProc dd 0
    Этот адрес затирался... А при вызове GetWindowText вообще затирались и все идущие следом дескрипторы... Ужас.
    Поменял на:
    szTextBuf db "D:\_SETUP_\_setup_\Update\WinXP\Обновления", 0, 0, 0, 0, 0, 0, 0, 0 dup (256)
    И ошибки не стало...
    А в чём дело, я так и не понял. Чем неправильно первое объявление переменной szTextBuf?
    Значит ноль 256 раз продублирован не был? Как это сделать? Почему 0 dup (256) не работает?
     
  8. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    итак, сначала - существует такая константа MAX_PATH = 260, показывает т.н. максимальную длину пути до файла в символах. Советую при резервировании памяти её пользоваться не 256...

    синтаксис : dup_count DUP (init_expression[,...]), т.е. первое-"сколько", второе-"чем".
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    т.е. 0 dup (256) это вообще ничего, а 256 dup (0) это 256 нулей
     
  10. Zhelezovsky

    Zhelezovsky Member

    Публикаций:
    0
    Регистрация:
    24 окт 2006
    Сообщения:
    39
    Всё понял! Надо же так два числа спутать. 256 dup (0) работает. Благодарю за помощь и прошу простить мою невнимательность.