Проводник передает полный путь к исполняемому файлу в аргументах командной строки

Я создал новое консольное приложение Win32. У этого есть главная точка входа:

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)

Я анализирую параметры в lpCmdLine:

LPWSTR *szArglist;
int nArgs;
szArglist = CommandLineToArgvW(lpCmdLine, &nArgs);
if (nArgs >= 1 && wcslen(szArglist[0]) > 0)
    productName = szArglist[0];
if (nArgs >= 2 && wcslen(szArglist[1]) > 0 && PathFileExists(szArglist[1]))
    installPath = szArglist[1];

Я хочу разобрать первый параметр как productName а второй параметр как installPath, Однако, если я запускаю эту программу из explorer, он устанавливает первый параметр как полный путь к исполняемому файлу.

Есть ли способ справиться с этим поведением? В каких ситуациях Windows передает аргументы моему приложению? Как я могу игнорировать их и заставить мое приложение принимать аргументы командной строки следующим образом:

application.exe "Product Name" "C:\Program Files\Product Name"

1 ответ

Решение

Похоже, мне просто нужно изменить свой подход путем анализа именованных аргументов:

LPWSTR *szArglist;
int nArgs;
szArglist = CommandLineToArgvW(lpCmdLine, &nArgs);
BOOL skipNext = false;
for (int i = 0; i < nArgs; i++) {
    if (skipNext) {
        skipNext = false;
        continue;
    }
    if (wcscmp(szArglist[i], L"/path") == 0 && i + 1 < nArgs && wcslen(szArglist[i + 1]) > 0 && PathFileExists(szArglist[i + 1])) {
        installPath = szArglist[i + 1];
        skipNext = true;
    }
    if (wcscmp(szArglist[i], L"/product") == 0 && i + 1 < nArgs && wcslen(szArglist[i + 1]) > 0) {
        productName = szArglist[i + 1];
        skipNext = true;
    }
}
Другие вопросы по тегам