Подтвердить что ты не робот

Разрушение WinMain cmdLine в аргументах main() старого стиля

Я хочу преобразовать аргумент WinMain cmdLine в argc и argv, поэтому я могу использовать функцию разбора аргументов, написанную для консольных приложений.

Это было бы тривиально, за исключением того, что я хочу также поддерживать "кавычки". Например:

test.exe test1 test2 "testing testing"

должен быть

argv[0] = "test.exe"; argv[1] = "test1"; argv[2] = "test2"; argv[3] = "testing testing";

Я понимаю, что cmdLine не имеет имени программы (argv [0]); это не имеет значения, я могу использовать фиктивное значение.

Я думал о том, чтобы делать это с регулярным выражением, (("[^"]+")\s+)|(([^\s]+)\s*) Я не уверен, насколько хорошо это сработает. Вероятно, это не очень хорошо? Есть ли какая-либо функция, чтобы сделать это в windows api? Благодаря

4b9b3361

Ответ 1

CommandLineToArgvW выглядит, как будто это было бы полезно здесь.

Ответ 2

Если вы используете компилятор Microsoft, существуют общедоступные символы __argc, __argv и __wargv, определенные в stdlib.h. Это также относится к MinGW, который использует библиотеки времени выполнения Microsoft.

Ответ 3

Если вам нужны простые аргументы argc, char ** argv, вы должны сделать это самостоятельно.

void fetchCmdArgs(int* argc, char*** argv) {
    // init results
    *argc = 0;

    // prepare extraction
    char* winCmd = GetCommandLine();
    int index = 0;
    bool newOption = true;
    // use static so converted command line can be
    // accessed from outside this function
    static vector<char*> argVector;

    // walk over the command line and convert it to argv
    while(winCmd[index] != 0){
        if (winCmd[index] == ' ') {
            // terminate option string
            winCmd[index] = 0;
            newOption = true;

        } else  {
            if(newOption){
                argVector.push_back(&winCmd[index]);
                (*argc)++;  
            }
            newOption = false;
        }
        index++;
    }

    // elements inside the vector are guaranteed to be continous
    *argv = &argVector[0];
}


// usage
int APIENTRY WinMain(...) {
    int argc = 0;
    char** argv;
    fetchCmdArgs(&argc, &argv);
}

Ответ 4

Основываясь на ответе Дениса К.

Смотрите: https://msdn.microsoft.com/library/dn727674.aspx

Это добавляет конкретную точку входа Windows в классическую начальную точку вашего приложения:

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char*, int nShowCmd)
{
    return main(__argc, __argv);
}