Здрасьте все. Тут одна элементарнейшая прога не получается. В общем я хотел сделать прогу, которая при запуске проверяет переданные через коммандную строку ей параметры, и если в коммандной строке ничего нет, то появляется окошком с заголовком: "Ты запустил эту прогу без параметров в коммандной строке", а если в коммандной строке есть параметр, то параметр появляется в заголовке окна. Я всё сделал, почти получилось, только если запускать мою прогу в Olly DBG и указать в пункте меню отладчик=>параметры что-либо, то это появляется в заголовке. Но если указать что-нибудь в командной строке - то появляется надпись "Ты запустил эту прогу без параметров в коммандной строке", как будто ничего нету. В общем, укажите пожалуйста мою ошибку... Исходник с моей прогой и пояснениями прикладываю. И ещё, может у кого-нибудь есть исходничек проги, которая обрабатывает коммандную строку?
так проще Код (Text): .data cmd_args dd 0 invoke GetCommandLine invoke PathGetArgs,eax mov cmd_args,eax mov al,[eax] ;Если параметры заключены в кавычки - убрать кавычки! .IF al != 0 .IF al == '"' invoke PathUnquoteSpaces,cmd_args mov cmd_args,eax .ENDIF .ENDIF xor ecx,ecx invoke MessageBox,ecx,cmd_args,ecx,ecx
Спасибо, буду разбираться, только можно пояснить несколько вещей: 1) Что такое al != 0 При чём тут восклицательный знак? Просто я не очень ещё разбираюсь во всех этих структурах 2) Объясните пожалуйста, структуру условного оператора .IF-.ELSEIF-.ELSE-.ENDIF и знаки неравенства, ну или хотя бы ссылочку подкиньте про такие структуры. А то читаю туторы Айсилона, он это использует но не объясняет
MSoft - спасибо. И ещё: Я не нашёл API ф-ций PathGetArgs и PathUnquoteSpace, хотя у меня справочник Win32.hlp что это за ф-ции?
.IF-.ELSEIF-.ELSE-.ENDIF аналогичен подобной структуре во всех языках Код (Text): .if condition0 ;condition0 is true ... .elseif condition1 ;condition1 is true ... .else ;both conditions are false ... .endif ;end of struct
RamMerLabs Спасибо, а какие есть знаки неравенства (<,>, и т.д), а то тут равенство это '==', а неравенство вообще ! =
_Poly_Glot_ < - меньше > - больше <= - меньше или равно >= - больше или равно == - равно != - не равно вроде ничего не забыл вообще есть доки по масму.
Booster а как там функции называются? возможно а повторил колесо, но если кому интересно мой код для решения проблемы ниже. Он парсит параметры начиная с имени программы, если параметр должен содержать пробелы необходимо заключить его в кавычки. используемая структура: Код (Text): ARGUMENTS_DESCRIBE struct ArgCount dd ? ;argument count, use argGetArgumentsCount to get this value lpArguments dd ? ;pointer to array of points to arguments parameters (asciiz) ARGUMENTS_DESCRIBE ends ERROR_PARSE_INCONRRECT_ARGUMENT equ -1 юзать примерно так (помоему красиво : Код (Text): ;parsing arguments invoke GetCommandLine mov esi, eax invoke argGetCount, eax ;получаем кол-во аргументов с именем самой программы mov ArgDesc.ArgCount, eax ;записываем в структуру imul eax, eax, sizeof (LPDWORD) ;cчитаем размер для буффера указателей invoke GlobalAlloc, GMEM_FIXED, eax ;выделяем память mov lpMem, eax ;cохраняем указатель mov ArgDesc.lpArguments, eax ;заносим указатель в стуктуру описаную выше invoke argParse, offset ArgDesc, esi ;парсим, на выходе получам указатели на asciiz строки параметров xor ebx, ebx ; обнуляем флаг присутствия хотя бы одного из нижеперечисленных параметров invoke argLookUp, $CTA0("-h"), offset ArgDesc or ebx, eax invoke argLookUp, $CTA0("-?"), offset ArgDesc or ebx, eax invoke argLookUp, $CTA0("/?"), offset ArgDesc or ebx, eax invoke argLookUp, $CTA0("/h"), offset ArgDesc .if (eax == TRUE) || ( ArgDesc.ArgCount == 1) || (ebx == TRUE) ;вывод справки ret .endif так же есть функция для нахождения "пары" заданного аргумента: Код (Text): invoke argFindPair, $CTA0("-offx"), offset ArgDesc сам код: Код (Text): argSkipSpaces proc uses eax;input\output param : esi @@: lodsb cmp al, 0 je @f cmp al, ' ' jne @f jmp @b @@: dec esi ret argSkipSpaces endp argSkipNonSpaces proc uses eax ;input\output param : esi @@: lodsb cmp al, 0 je @f cmp al, ' ' je @f jmp @b @@: dec esi ret argSkipNonSpaces endp argSkipNonQuotes proc uses eax;input\output param : edi @@: lodsb cmp al, 0 je @f cmp al, '"' je @f jmp @b @@: dec esi ret argSkipNonQuotes endp argGetCount proc uses esi edi, lpszStr: DWORD;(with program name itself) mov esi, lpszStr xor ecx, ecx .if byte ptr [esi] == 0 xor eax, eax ret .endif .repeat .if byte ptr [esi] == '"' inc esi invoke argSkipNonQuotes inc ecx .break .if byte ptr [esi] == 0 ;if : "asdf\0 inc esi .break .if byte ptr [esi] == 0 .else invoke argSkipNonSpaces inc ecx .break .if byte ptr [esi] == 0 .endif invoke argSkipSpaces .break .if byte ptr [esi] == 0 .until FALSE mov eax, ecx ret argGetCount endp argParse proc uses esi edi, lpArgumentsDesc: DWORD, \;pointer to initialized ARGUMENTS_DESCRIBE, see include file lpszStr: DWORD mov edx, lpArgumentsDesc mov esi, lpszStr mov edi, (ARGUMENTS_DESCRIBE ptr [edx]).lpArguments xor ecx, ecx .if byte ptr [esi] == 0 mov eax, ERROR_PARSE_INCONRRECT_ARGUMENT ret .endif .repeat .if byte ptr [esi] == '"' inc esi mov eax, esi stosd invoke argSkipNonQuotes inc ecx .break .if byte ptr [esi] == 0 ;if : "asdf\0 mov byte ptr [esi], 0 inc esi .break .if byte ptr [esi] == 0 .else mov eax, esi stosd invoke argSkipNonSpaces inc ecx .break .if byte ptr [esi] == 0 mov byte ptr [esi], 0 inc esi .endif invoke argSkipSpaces .break .if byte ptr [esi] == 0 .until FALSE mov eax, (ARGUMENTS_DESCRIBE ptr [edx]).ArgCount .if eax == ecx mov eax, ERROR_SUCCESS .else mov eax, ERROR_PARSE_INCONRRECT_ARGUMENT .endif ret argParse endp argFindPair proc uses esi edi, \ lpszFirstArg:DWORD, \ ;IN lpArgDesc:DWORD ;IN pointer to ARGUMENTS_DESCRIBE ;returns pointer to pair argument mov eax, lpArgDesc mov edi, (ARGUMENTS_DESCRIBE ptr [eax]).ArgCount mov esi, (ARGUMENTS_DESCRIBE ptr [eax]).lpArguments lodsd ;skip first argumen - application name .while (edi != 1) dec edi lodsd invoke lstrcmp, lpszFirstArg, eax .break .if !eax .endw .if edi == 1 mov eax, FALSE .else mov eax, [esi] .endif ret argFindPair endp argLookUp proc uses edi esi, lpszArg:DWORD, \ ;IN lpArgDesc:DWORD ;IN pointer to ARGUMENTS_DESCRIBE ;returns TRUE if arument exists ELSE otherwise mov eax, lpArgDesc mov edi, (ARGUMENTS_DESCRIBE ptr [eax]).ArgCount mov esi, (ARGUMENTS_DESCRIBE ptr [eax]).lpArguments lodsd ;skip first argumen - application name .while (edi != 1) lodsd invoke lstrcmp, lpszArg, eax .break .if !eax dec edi .endw .if !eax mov eax, TRUE .else mov eax, FALSE .endif ret argLookUp endp зы если кто будет юзать этот код и найдёт в нём баги просьба отписать в аську\личку
Всё написано за нас: GetCommandLineW + CommandLineToArgvW спасут отцов русской демократии Ну и WideCharToMultiByte если прога не юникодная.
они в shlwapi.dll нужно подключить include \masm32\include\shlwapi.inc includelib \masm32\lib\shlwapi.lib
rain Названия не помню (склероз), масма сейчас под рукой нету. В пакете масма есть справка по masmlib и там всё подробно описано. Распарсивает оно довольно хорошо, там тоже массив аргументов создаётся. Причём так как она в исходниках, то и портировать её можно.