Отправка аргумента в .exe через SHELLEXECUTEINFO - PullRequest
1 голос
/ 25 февраля 2020

У меня есть .exe, который принимает 2 аргумента. Мне нужно запустить файл .exe между моей программой во время выполнения. Я использовал ShellExecuteEx для запуска файла .exe, но он не принимает аргументы. Пожалуйста, помогите, где я ошибся. Я публикую свой код ниже.

void StartProgram() {
    SHELLEXECUTEINFO lpExecInfo;
    lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    lpExecInfo.lpFile = L"F:\\EXEFolder\\RunMe.exe"; // Path to the .exe
    lpExecInfo.fMask = SEE_MASK_DOENVSUBST | SEE_MASK_NOCLOSEPROCESS;
    lpExecInfo.hwnd = NULL;
    lpExecInfo.lpVerb = L"open"; // to open  program
    lpExecInfo.lpParameters = L"D:/input.csv" "F:/output.csv;"; //Arguments to be passed to .exe
    lpExecInfo.lpDirectory = NULL;
    lpExecInfo.nShow = SW_SHOW;
    lpExecInfo.hInstApp = (HINSTANCE)SE_ERR_DDEFAIL;   
    ShellExecuteEx(&lpExecInfo);
    //wait until a file is finished printing
    if (lpExecInfo.hProcess != NULL)
    {
        ::WaitForSingleObject(lpExecInfo.hProcess, INFINITE);
        ::CloseHandle(lpExecInfo.hProcess);
    }
}

1 Ответ

6 голосов
/ 25 февраля 2020

Элемент lpParameters является указателем на строку аргументов, разделенных пробелами, так же, как вы передаваете их в среде командной строки.

Если вы хотите передать программе два аргумента, вы делаете это как

lpExecInfo.lpParameters = L"argument1 argument2";

Для вашего случая это должно быть похоже на

lpExecInfo.lpParameters = L"D:/input.csv F:/output.csv";

Чтобы объяснить, что вы делаете неправильно, у компилятора C ++ есть фаза, где он объединяет смежную строку литералы в одну строку. Это означает, что L"D:/input.csv" "F:/output.csv;" будет объединен в L"D:/input.csvF:/output.csv;", который является одиночным аргументом.

...