gpt4 book ai didi

c++ - Windows 10上的CreateProcess API失败,错误代码122

转载 作者:行者123 更新时间:2023-12-02 10:39:17 28 4
gpt4 key购买 nike

我正在使用CreateProcess api启动批处理文件。该代码在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失败的原因。

最佳答案

您需要将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);
}

关于c++ - Windows 10上的CreateProcess API失败,错误代码122,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52057602/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com