Вопрос о командной строке в винде

Тема в разделе "WASM.WIN32", создана пользователем shoo, 26 дек 2005.

  1. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    запустив программу по-разному с передачей ей параметров можно получить имя запускаемого файла в начале строки, а можно и не получить.

    вопрос: есть ли простой способ это узнать из запущенной программы? или только нужно анализировать идентичность первого параметра "себе"?
     
  2. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    int main(int argc, char *argv[])



    argv[0] - "по жизни" указывает на строку содержащую полный путь к проге, при этом когда нет параметров argc == 1.



    При каком способе передачи параметров ты не получишь argv[0] ? Я чёто не допонял?
     
  3. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    да вот сам видел. правда, сейчас воспроизвести не могу, но постараюсь: запускал одну и ту же прогу, которая просто берет GetCommandLine и ее показывает: в одном случае есть имя экзешника, в другом - нет. еще поколдую, а то это было несколько месяцев назад - ща вот просто вспомнил.

    ---

    может, мне конечно, показалось, но меня это впечатлило, т.к. одна моя прога не захотела работать из-за этого
     
  4. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    а вот: уж не знаю еще как Антонис запускает прогу, но вот прога, запущенная из ВинАсм иде и она же запущенная "вручную" с одинаковым "параметром". Разница очевидна ;)



    [​IMG]
     
  5. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    ну да, через CreateProcess. Вот и игрушка (runs запускать из одной директории с emutest)



    [​IMG] 956065720__runs.1.1.zip



    так что, вопрос пока в силе ;)
     
  6. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    Хорошо. Итак конткретизируй вопрос: чё именно узнать надо?
     
  7. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    мне нужна строка гарантированно без имени запущенного модуля. и по-проще ;)
     
  8. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Следует копать в сторону GetCommandLineW/CommandLineToArgW
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Код (Text):
    1.    args = PathGetArgs(GetCommandLine());
    2.    if(args){
    3.       aux = strlen(args);
    4.       if(*args == '"'){
    5.          // erase ending quotation mark
    6.          *(args + aux - 1) = '\0';
    7.          // skip starting quotation mark
    8.          args++;
    9.       }
    10.    }
    11. // args указывает на параметры командной строки
    12.  


    Или ещё вариант:
    Код (Text):
    1.     invoke GetCommandLine
    2.     mov args,eax
    3.     invoke PathGetArgs,args
    4.     mov args,eax
    5.     mov dl,[eax]
    6.     .IF dl != 0
    7.         .IF dl == '"'
    8.             invoke PathUnquoteSpaces,eax
    9.         .ENDIF
    10.         mov args,eax
    11.     .ENDIF
    12. ; args указывает на параметры командной строки
    13.  




    PathGetArgs и PathUnquoteSpaces сидят в shlwapi, кажется.
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    shoo

    Можно попробовать искать имя программы, полученное при помощи GetModuleFileName, в первом параметре, полученном при помощи GetCommandLine. Хотя нет никакой гарантии, что реальный первый параметр на будет совпадать с именем программы.
     
  11. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine


    тот же результат, только в профиль





    "неработавшая" прога начиналась так:
    Код (Text):
    1.       invoke GetCommandLine
    2.       mov CommandLine, eax
    3.       invoke PathGetArgs,CommandLine
    4.       mov CommandLine, eax
    5.  
    (текст оригинала)





    можно, но разве кто-то так делает? я запустил через CreateProcess OllyDebug: он переданную в командной строке прогу не открыл, а вот так:

    blablabla e:\icqlite.exe - открыл ;) и мс-ворд выявил то же поведение ;) по-моему, это неправильно ;) в простонародии - баг.
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    shoo

    но разве кто-то так делает?

    Я другого варианта не вижу.



    запустил через CreateProcess OllyDebug: он переданную в командной строке прогу не открыл ... мс-ворд выявил то же поведение

    Запускай CreateProcess по другому - CreateProcess(NULL, prog + " " + cmdline, ... и будет тебе счастье.
     
  13. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    - это понятно :) другое дело, если "тебя" запустили ;) (на чем я кстати и попался)