Обязательно ли указывать путь в CreateProcess?

Тема в разделе "WASM.BEGINNERS", создана пользователем M0rg0t, 14 ноя 2020.

  1. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Тупой вопрос, но не могу что-то до конца понять. Есть функция CreateProcess, в какой как известно, 2 первых параметра lpApplicationName и lpCommandLinе, куда можно передать имя запускаемого файла.

    Собственно, вопрос: если lpApplicationName указан (допустим, C:\test.exe), нужно ли дублировать путь к файлу в lpCommandLinе , или передать туда только параметры?
    Т.е. как правильно будет,
    Код (Text):
    1. CreateProcess("C:\test.exe","-param1 -param2"..
    или надо все же
    Код (Text):
    1. CreateProcess("C:\test.exe","C:\test.exe -param1 -param2"..
    ?
    Мсдн пишет
    ..Because argv[0] is the module name, C programmers generally repeat the module name as the first token in the command line...

    Но я так и не понял, обязательно оно или нет. На тестах по разному бывает.
    p.s. я знаю, что код выше неверный, т.к. lpCommandLinе должен быть не-CONST, но это псевдокод.

    p.p.s. да, обычно пишут все во втором параметре
    Код (Text):
    1. CreateProcess(NULL,"C:\test.exe -param1 -param2"..
    но мне интересно, если первый не NULL
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
  3. vitokop

    vitokop Member

    Публикаций:
    0
    Регистрация:
    20 май 2006
    Сообщения:
    39
    Из опыта-работает всегда

    1- nil or -> pApplicationName
    2- полная командная строка - типа "C:\test.exe -param1 -param2".. > lpCommandLine
    ...
    8 - директория запуска (рабочая)

    pApplicationName:

    Указатель на строку с нулевым завершением, указывающую выполняемый модуль.
    Строка может указывать полный путь и имя файла модуля для выполнения.
    Строка может указывать частичное имя. В этом случае функция использует текущий диск и текущий каталог для завершения спецификации.
    Параметр lpApplicationName может иметь значение NULL. В этом случае имя модуля должно быть первым маркером, разделенным пробелами, в строке lpCommandLine.
    Указанный модуль может быть приложением на базе Win32. Это может быть какой-то другой тип модуля (например, MS-DOS или OS/2), если соответствующая подсистема доступна на локальном компьютере.
    Windows NT: если исполняемый модуль является 16-разрядным приложением, lpApplicationName должно быть равно NULL, а строка, на которую указывает lpCommandLine, должна указывать исполняемый модуль. 16-битное приложение-это приложение, которое выполняется как процесс VDM или WOW.
     
  4. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    352
    Еще немного информации по функции ->CreateProcess()<-. Может кому-нибудь пригодится.
     
  5. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.574
    Спасибо всем, собственно вот ответ (по ссылке Mikl___ )
    Винапи такой винапи.
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    M0rg0t нравится это.