|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 5, 2003 22:25:18 · Поправил: Asterix Понадобилось написать процедуру обработки командной строки, ну я последовательно написал 3-и варианта: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 1) строка задаётся с:\Program Files\cmdline3 blabla ---------------------------------------------------------------------- работает везде если путь к файлу не содержит пробелов! ---------------------------------------------------------------------- .386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
cmdline dd 0
.code
start:
invoke GetCommandLine
mov cmdline, eax
mov esi,eax
metka:
invoke lstrlen,esi
test eax,eax
jz noparam
.if byte ptr [esi]!=' '
inc esi
jmp metka
.endif
inc esi
noparam:
invoke MessageBox, NULL,esi, 0, MB_OK
invoke ExitProcess,NULL
end start
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 2) строка задаётся с:\Program Files\cmdline3 blabla ---------------------------------------------------------------------- работает даже если путь к файлу содержит пробелы, но только под w98, отгадайте почему не работает в XP :-) ---------------------------------------------------------------------- metka: invoke lstrlen,esi test eax,eax jz noparam .if byte ptr [esi]!='"' inc esi jmp metka .endif inc esi .if byte ptr [esi]!=' ' jmp metka .endif inc esi noparam: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 3) строка задаётся с:\Program Files\cmdline3 /blabla ---------------------------------------------------------------------- работает везде и всегда ---------------------------------------------------------------------- metka: invoke lstrlen,esi test eax,eax jz noparam .if byte ptr [esi]!=' ' inc esi jmp metka .endif inc esi .if byte ptr [esi]!='/' jmp metka .endif inc esi noparam: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Хотелось узнать, как в действительности выглядит правильное написание данной процедуры, примеры приветствуются... |
|
|
Дата: Авг 5, 2003 22:57:42 Asterix До конца не понял, что ты хочешь сказать, но вот посмотри, может быть подойдет... .386
.model flat, stdcall
option casemap:none
;
.data
;
mFileName db 260 dup(0)
;
.code
_start:
cld ; сбросим флаг направления
call GetCommandLine ; получим нашу командную строку
mov edi,eax ;
mov al,20h ; пробел
mov ecx,260
repne scasb ; найдем конец имени нашей программы
cmp byte ptr [edi],0
je cmdline_empty
mov esi,edi
mov edi,offset mFileName
rep movsb
push 0
push 0
push offset mFileName
push 0
call MessageBox
cmdline_empty:
_exit_process:
push 0
call ExitProcess
end _start
|
|
|
Дата: Авг 5, 2003 23:03:11 Asterix 2) Этот метод... как бы помягче выразиться... отдыхает. 3) А если путь задать так: C:/Program Files/cmdline3 /blabla :))) ToolHelp, например, такие пути любит. 1) Самое оно! Просто надо обрабатывать строку наоборот (с конца): invoke GetModuleFileName,0,OFFSET strBuf,255 test eax,eax jz _badpath mov edi,OFFSET strBuf add edi,eax xchg eax,ecx mov al,' ' std repnz scasb cld jnz _badpath add edi,2 xor eax,eax invoke MessageBox,eax,edi,eax,eax _badpath: |
|
|
Дата: Авг 5, 2003 23:10:41 · Поправил: Asterix [ Quantum: А если путь задать так: C:/Program Files/cmdline3 /blabla :))) ToolHelp, например, такие пути любит.] Путь с прямыми слэшами возможен только в Перле, ну или в подобном софте... Да, кстати, не вижу проблем для третьего примера в строке вида C:/Program Files/cmdline3 /blabla [ Quantum: 2) Этот метод... как бы помягче выразиться... отдыхает.] Нечто подобное реализовано в notepad.exe под win98 KiNDeR,Quantum я потестирую ваши примеры... потом напишу... |
|
|
Дата: Авг 5, 2003 23:19:09 Asterix Путь с прямыми слэшами возможен только в Перле, ну или в подобном софте... Эх, Asterix, невнимательно читаем посты... Нечто подобное реализовано в notepad.exe под win98 Неудивительно... мастдай, однако! |
|
|
Дата: Авг 5, 2003 23:22:22 Нет, я внимательно читаю :-), только я не понял, что такое ToolHelp, в данном случае. |
|
|
Дата: Авг 5, 2003 23:30:38 · Поправил: Quantum Asterix Ладно, не обижайся :-) Просто у меня в WinME ToolHelp возвращает именно такие пути (с '/'). ЗЫ: ToolHelp выдаёт список некоторых запущенных процессов (как по Ctrl+Alt+Del в 9x). Да, кстати, не вижу проблем для третьего примера в строке вида C:/Program Files/cmdline3 /blabla Точно, но мне этот пример всё равно не очень нравится. |
|
|
Дата: Авг 5, 2003 23:32:13 · Поправил: Asterix KiNDeR На первый взгляд мне показалось что твой пример не работает если в пути к файлу присутствует символ пробела, так оно и оказалось, поэтому утверждаю что твой пример работает по моему первому варианту. |
|
|
Дата: Авг 5, 2003 23:34:46 ЗЫ: ToolHelp выдаёт список некоторых запущенных процессов (как по Ctrl+Alt+Del в 9x). Я про этот ToolHelp и подумал, но засомневался вдруг какой soft неведомый :-) Да..., я и не думал обижаться :-) |
|
|
Дата: Авг 5, 2003 23:38:38 [ Quantum: Точно, но мне этот пример всё равно не очень нравится.] Это не оправдание :-) Ты укажи случай когда этот пример не будет работать :-))))))))))))) |
|
|
Дата: Авг 5, 2003 23:43:42 Asterix Что ты хочешь получить, обясни еще раз? Я задал такую строку: testw.exe строка содержащая пробелы и слеши \ / И строка создалась... |
|
|
Дата: Авг 5, 2003 23:54:43 Quantum Твой пример не работает если в командной строке нет параметров, может я не правильно его использовал, но тогда приведи полный код программы ;-) |
|
|
Дата: Авг 5, 2003 23:56:44 · Поправил: Asterix KiNDeR Скомпили мой 3-ий пример и тебе станет ясно. Я хочу получить в MessageBox'е именно blabla Да, еще..., и если этого blabla нет, т.е. нет ничего в управляющих параметрах, то messagebox должен быть пустым... |
|
|
Дата: Авг 6, 2003 00:21:01 Asterix Ну а вот так? .386
.model flat, stdcall
option casemap:none
;
.data
;
mParam db 260 dup(0)
;
.code
_start:
cld ; сбросим флаг направления
call GetCommandLine ; получим нашу командную строку
mov edi,eax ;
mov al,20h ; пробел
mov ecx,260
repne scasb ; найдем конец имени нашей программы
cmp byte ptr [edi],0
je cmdline_empty
mov al,'/'
repne scasb
mov esi,edi
mov edi,offset mParam
rep movsb
push 0
push 0
push offset mParam
push 0
call MessageBox
cmdline_empty:
_exit_process:
push 0
call ExitProcess
end _start |
|
|
Дата: Авг 6, 2003 00:34:04 · Поправил: Asterix KiNDeR Вроде работает, но под OllyDbg в 98-й твоя прога выводит кракозяблики в messagebox, если командная строка не содержит управляющих параметров. Под XP не тестировал... Добавлено: кракозяблики выводит, видимо, только иногда... и реализовано это по третьему варианту |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.090 |