Как получить исходные аргументы командной строки

Мне нужно передать аргументы командной строки из A.exe в B.exe. Если A.exe с несколькими аргументами вроде

A.exe -a="a" -b="b"'

и я могу использовать

BeginProcess("B.exe", **args!**)

чтобы запустить B.exe. Как получить исходные аргументы командной строки, например

'-a="a" -b="b"'

Ответ 1

Если вы находитесь в Windows, вы используете GetCommandLine для получения исходной командной строки.

Обратите внимание, что GetCommandLine также включает argv [0]. Поэтому вам нужно выйти за пределы argv [0] из вывода GetCommandLine, прежде чем передать его в B.

Это некорректный код, не проверяемый ошибкой, чтобы сделать это

#include <string.h>
#include <windows.h>
#include <iostream>
#include <ctype.h>

int main(int argc, char **argv)
{
    LPTSTR cmd  = GetCommandLine();

    int l = strlen(argv[0]);

    if(cmd == strstr(cmd, argv[0]))
    {
        cmd = cmd + l;
        while(*cmd && isspace(*cmd))
            ++cmd;
    }

    std::cout<<"Command Line is : "<<cmd;

}

Когда я запускаю указанную выше программу как A.exe -a="a" -b="b", я получаю следующий вывод

A.exe -a="a" -b="b"
Command Line is : -a="a" -b="b"

Ответ 2

Вот один и единственный правильный способ пропустить имя исполняемого файла, основанный на реализации Wine CommandLineToArgvW:

char *s = lpCmdline;
if (*s == '"') {
    ++s;
    while (*s)
        if (*s++ == '"')
            break;
} else {
    while (*s && *s != ' ' && *s != '\t')
        ++s;
}
/* (optionally) skip spaces preceding the first argument */
while (*s == ' ' || *s == '\t')
    s++;

Ответ 3

Стандартное определение main равно

int main(int argc, char* argv[])

Переменная argv содержит аргументы командной строки. Переменная argc указывает количество записей в массиве argv.

Ответ 4

Необработанная строка, введенная в оболочку, преобразуется оболочкой в ​​ argv до запуска вашей программы. Я никогда не слышал о операционной системе или оболочке, предоставляющей "сырую" командную строку в дополнение к argv.

Что делать, если пользователь использовал кавычки для передачи пробела в ваши аргументы? Что делать, если они использовали обратную косую черту, чтобы избежать цитаты внутри кавычек? Различные оболочки могут даже иметь разные правила кавычек.

Если у вас есть список вроде argv, вы должны попытаться найти API, который соглашается с этим, а не пытаться реализовать строковую обработку, которая только вспомогательна к фактической цели. Microsoft серьезно относится к безопасности, и они, безусловно, предоставляют то, что не требует добавления в ваше приложение дыры безопасности.

Я не могу найти документацию о любом C/С++ API BeginProcess; Я вроде бы предполагаю, что это Windows, но в любом случае вам стоит дважды проверить справочное руководство по платформе для альтернативного системного вызова.

Ответ 5

Вот как я перехожу к командной строке в shell args. Иногда это хорошо, чтобы эхо в выходной файл, чтобы сохранить "какие аргументы были использованы" вместе с выходом. Уклонение является рудиментарным и достаточным для большинства ситуаций.

Я начал вывод по команде (i = 0). Вы можете изменить на (i = 1), если хотите только аргументы и т.д.

//you have to free() the result!, returns null if no args
char *arg2cmd(int argc, char** argv) {
    char *buf=NULL;
    int n = 0;
    int k, i;
    for (i=0; i <argc;++i) {
        int k=strlen(argv[i]);
        buf=( char *)realloc(buf,n+k+4);
        char *p=buf+n;
        char endq=0;
        // this is a poor mans quoting, which is good enough for anything that not rediculous
        if (strchr(argv[i], ' ')) {
            if (!strchr(argv[i], '\'')) {
                *p++='\'';
                endq='\'';
            } else {
                *p++='\"';
                endq='\"';
            }
        }
        memcpy(p, argv[i], k);
        p+=k;
        if (i < (argc-1)) *p++=' ';
        if (endq) *p++=endq;
        *p='\0';
        n = p-buf;
    }
    return buf;
}

И простая оболочка cpp:

std::string arg2string(int argc, char **argv) {
    char *tmp=arg2cmd(argc, argv);
    std::string ret=tmp;
    free(tmp);
    return ret;
}

Ответ 6

В C++/CLI есть это:

String^ cmdarg = Environment::CommandLine;