Сбой API CreateProcess с кодом ошибки 122 в Windows 10

Я использую API CreateProcess для запуска командного файла. Код прекрасно работает в Windows 7, но не работает в Windows 10.
Ниже приведен фрагмент кода:

CString param; //it holds the very long string of command line arguments
wstring excFile = L"C:\\program files\\BatchFile.bat";
wstring csExcuPath = L"C:\\program files";
wstring exeWithParam = excFile + _T(" ");
exeWithParam = exeWithParam.append(param);
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
TCHAR lpExeWithParam[8191];
_tcscpy_s(lpExeWithParam, exeWithParam.c_str());
BOOL bStatus = CreateProcess(NULL, lpExeWithParam, NULL, NULL, TRUE, CREATE_NEW_CONSOLE | CREATE_BREAKAWAY_FROM_JOB, NULL, csExcuPath.c_str(), &si, &pi);

DWORD err;
if (!bStatus)
{
err = GetLastError();
}

С помощью приведенного выше кода он вызывает командный файл, который запускает исполняемый файл с заданными параметрами. Этот код не работает только Windows 10 в нашем продукте.
GetLastError возвращает код ошибки 122, код ошибки: «Область данных, переданная системному вызову, слишком мала». Как выяснить, что является причиной этой ошибки и как ее можно устранить?

Однако при использовании одного и того же кода в примере тестовое приложение не выдает никакой ошибки и прохождения.
Любая подсказка / подсказка, почему это вызывает сбой в Windows 10.

0

Решение

Вам нужно выполнить cmd.exe с .bat файл в качестве параметра, не пытайтесь выполнить .bat непосредственно.

Кроме того, вам не нужно lpExeWithParam, вы можете пройти exeWithParam прямо к CreateProcess(),

Попробуйте что-то более похожее на это:

CString param; //it holds the very long string of command line arguments
...
wstring excFile = L"C:\\program files\\BatchFile.bat";
wstring csExcuPath = L"C:\\program files";
wstring exeWithParam = L"cmd.exe /c \"" + excFile + L"\" ";
exeWithParam.append(param);

STARTUPINFOW si = { sizeof(si) };
PROCESS_INFORMATION pi = {};

BOOL bStatus = CreateProcessW(NULL, &exeWithParam[0]/*or exeWithParam.data() in C++17*/, NULL, NULL, TRUE, CREATE_NEW_CONSOLE | CREATE_BREAKAWAY_FROM_JOB, NULL, csExcuPath.c_str(), &si, &pi);
if (!bStatus)
{
DWORD err = GetLastError();
...
}
else
{
...
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
1

Другие решения

Ошибка 122 приравнивается к ERROR_INSUFFICIENT_BUFFER, и я думаю, что ключом здесь является «она содержит очень длинную строку аргументов командной строки».

Как долго это длится? Предел может быть ниже на Windows 10 — я рекомендую вам поэкспериментировать (бинарная отбивная).

Так же документация за CreateProcess утверждает, что вы должны запустить cmd.exe явно, чтобы запустить командный файл, так что я думаю, вы должны делать то, что он говорит.

0

Я думаю, что для запуска пакетного файла вы должны установить lpApplicationName на cmd.exe и установить lpCommandLine для следующих аргументов: / c плюс имя пакетного файла

-2
По вопросам рекламы [email protected]