Консультация № 55363
13.09.2006, 22:36
0.00 руб.
0 1 1
Здравствуйте ЭКСПЕРТЫ!
Попробовал написать программу, кот. должна выводить аргументы командной строки в окне MessageBox, или текст "Отсутствуют", если аргументов нет.
Результат:
1) При запуске с аргументами - аргументы выводятся.
2) При запуске без аргументов появляется MessageBox, но без текста "Отсутствуют".
При запуске под отладчиком (Olly) - текст выводится.
Вопрос. В чем дело?
Заранее спасибо.

Приложение:
.386 .model flat, stdcall option casemap:none; case sensitive include c:\masm32\include\windows.inc include c:\masm32\include\user32.inc include c:\masm32\include\kernel32.inc includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib .data MsgBoxText db "Отсутствуют",0 MsgBoxCaption db "Аргументы командной строки",0 .codestart: call GetCommandLine add eax,8 ; Минимальная длина файла, например c:\a.exeeofname: inc EAX cmp word ptr[EAX],22h ;Сверяем с кавычками и нулем (2200h) jz no cmp word ptr[eax],2022h ;Сверяем с кавычками и пробелом (2220h) jz get jmp eofnameget: add eax,2 push 0 ; Выводим push offset MsgBoxCaption ; аргументы push EAX ; командной push 0 ; строки call MessageBox jmp exitno: push 0 ; Выводим push offset MsgBoxCaption ; сообщение push offset MsgBoxText ; "Отсутствуют" push 0 call MessageBox exit: push 0 call ExitProcessend start

Обсуждение

давно
Посетитель
7438
7205
14.09.2006, 19:13
общий
это ответ
Здравствуйте, Юpий!
Некорректно построен поиск параметров.
1) Рассматривается только случай, когда имя программы заключено в кавычки.
Это неверно, если имена папок не содержит пробелов, то путь будет без кавычек.
2) Неверное предположение о том, что если нет параметров, то конечный нуль будет сразу за именем программы, перед нулем может быть пробел.
Что, кстати у тебя и наблюдается: твой отладчик формирует команду запуска без пробела - и ты попадаешь на метку "no", запускаешь саму по себе, ОСь вставляет пробел - попадаешь на "get", а там нуль, т.е. пустая строка!
Вставь следующий анализ, и заработает (случай с кавычками).
get:
add eax,2
cmp byte ptr [eax],0 ;!!!!!!
je no ;!!!!!!
push 0 ; Выводим
Для полноты картины надо еще добавить анализ случая без кавычек...
Удачи!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа