· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Правильно писать CommandLine procedure...

. 1 . 2 . 3 . 4 . 5 . >>

Посл.отвђт Сообщен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 не тестировал...
Добавлено: кракозяблики выводит, видимо, только иногда...
и реализовано это по третьему варианту

. 1 . 2 . 3 . 4 . 5 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.090