Всем привет. Ввел в свою прогу процедуру, дополняющую строку в конце слэшем для формирования правильного пути доступа. После этого она начала рушиться. Процедура: 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 их настраивает сама. В чём же дело???
Zhelezovsky Этот код правильно написан! стопудофф! Ошибка формируется до вызова процедуры! P. S. Воспользуйся отладчиком (OllyDbg) [Добавил] Увеличь буфер szTextBuf на один байт, может, трет какие-то важные значения!
Zhelezovsky Возможно забыл сохранить\восстановить edi: uses edi или push edi + pop edi PS: хотя на MessageBox edi не должен влиять... Скорее всего дело в szTextBuf (или замык.нуля нет или наоборот нуль в первой позиции - и то и другое может приводить к затиранию соседних переменных)
leo Ага, я тоже так сначала подумал Наверно, автор уже сам нашёл ошибку и стыдится выкладывать свой код
Zhelezovsky У меня твой код работает нормально, видимо, причина в другом. У меня похожая ошибка была когда после std не сбрасывал DF.
Благодарю всех за желание помочь. Я действительно нашёл ошибку. Буфер - это он. Он был объявлен следующим образом: 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) не работает?
итак, сначала - существует такая константа MAX_PATH = 260, показывает т.н. максимальную длину пути до файла в символах. Советую при резервировании памяти её пользоваться не 256... синтаксис : dup_count DUP (init_expression[,...]), т.е. первое-"сколько", второе-"чем".
Всё понял! Надо же так два числа спутать. 256 dup (0) работает. Благодарю за помощь и прошу простить мою невнимательность.