Разбивка cmdLine WinMain в аргументах main () старого стиля - PullRequest
13 голосов
/ 27 февраля 2010

Я хочу преобразовать 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? Спасибо

Ответы [ 4 ]

22 голосов
/ 27 февраля 2010

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

5 голосов
/ 27 февраля 2010

CommandLineToArgvW похоже, что здесь будет полезно.

2 голосов
/ 18 октября 2016

На основании ответа Дениса К

См .: https://msdn.microsoft.com/library/dn727674.aspx

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

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char*, int nShowCmd)
{
    return main(__argc, __argv);
}
0 голосов
/ 20 июня 2014

Если вам нужен простой аргумент int 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...