Сбой API CreateProcess с кодом ошибки 122 в Windows 10 - PullRequest
0 голосов
/ 28 августа 2018

Я использую 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.

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

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

0 голосов
/ 28 августа 2018

Вам необходимо выполнить 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);
}
0 голосов
/ 28 августа 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...