C++ C++;-在不使用系统从批处理文件转换的情况下运行程序
我正在尝试运行一个带有一些参数的程序。我已经使用批处理文件完成了这项工作。我在那里使用的命令是C++ C++;-在不使用系统从批处理文件转换的情况下运行程序,c++,python,process,minecraft,C++,Python,Process,Minecraft,我正在尝试运行一个带有一些参数的程序。我已经使用批处理文件完成了这项工作。我在那里使用的命令是\runtime\bin\python\python\u mcp。\runtime\recompile.py%* 实际上,我在网上找到了一个很好的启动程序函数,我只是稍微调整了一下。因为我从一个非常不同的位置运行新程序,所以同一个命令不起作用(我猜是$*导致了问题!) 我试过这个和一些变体 ExecuteProcess(L"E:\\Modding\\mcp\\runtime\\bin\\python\\
\runtime\bin\python\python\u mcp。\runtime\recompile.py%*
实际上,我在网上找到了一个很好的启动程序函数,我只是稍微调整了一下。因为我从一个非常不同的位置运行新程序,所以同一个命令不起作用(我猜是$*
导致了问题!)
我试过这个和一些变体
ExecuteProcess(L"E:\\Modding\\mcp\\runtime\\bin\\python\\python_mcp.exe", L"E:\\Modding\\mcp\\runtime\\recompile.py %*");
以下是函数的代码:
size_t ExecuteProcess(wstring FullPathToExe, wstring Parameters = L"", size_t SecondsToWait = -1)
{
size_t iMyCounter = 0, iReturnVal = 0, iPos = 0;
DWORD dwExitCode = 0;
std::wstring sTempStr = L"";
/* - NOTE - You should check here to see if the exe even exists */
/* Add a space to the beginning of the Parameters */
if (Parameters.size() != 0)
{
if (Parameters[0] != L' ')
{
Parameters.insert(0,L" ");
}
}
/* The first parameter needs to be the exe itself */
sTempStr = FullPathToExe;
iPos = sTempStr.find_last_of(L"\\");
sTempStr.erase(0, iPos +1);
Parameters = sTempStr.append(Parameters);
/* CreateProcessW can modify Parameters thus we allocate needed memory */
wchar_t * pwszParam = new wchar_t[Parameters.size() + 1];
if (pwszParam == 0)
{
return 1;
}
const wchar_t* pchrTemp = Parameters.c_str();
wcscpy_s(pwszParam, Parameters.size() + 1, pchrTemp);
/* CreateProcess API initialization */
STARTUPINFOW siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
siStartupInfo.cb = sizeof(siStartupInfo);
if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()),
pwszParam, 0, 0, false,
CREATE_DEFAULT_ERROR_MODE, 0, 0,
&siStartupInfo, &piProcessInfo) != false)
{
/* Watch the process. */
dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (SecondsToWait < 0) ? INFINITE : (SecondsToWait * 1000));
}
else
{
/* CreateProcess failed */
iReturnVal = GetLastError();
}
/* Free memory */
delete[]pwszParam;
pwszParam = 0;
/* Release handles */
CloseHandle(piProcessInfo.hProcess);
CloseHandle(piProcessInfo.hThread);
return iReturnVal;
}
size\u t ExecuteProcess(wstring FullPathToExe,wstring参数=L“”,size\u t SecondsToWait=-1)
{
size_t iMyCounter=0,iReturnVal=0,IPO=0;
DWORD dwExitCode=0;
std::wstring-sTempStr=L“”;
/*-注意-您应该在此处检查exe是否存在*/
/*在参数的开头添加一个空格*/
如果(Parameters.size()!=0)
{
如果(参数[0]!=L“”)
{
参数。插入(0,L“”);
}
}
/*第一个参数必须是exe本身*/
sTempStr=FullPathToExe;
iPos=sTempStr.find\u last\u of(L“\\”);
sTempStr.erase(0,iPos+1);
参数=sTempStr.append(参数);
/*CreateProcessW可以修改参数,从而分配所需的内存*/
wchar_t*pwszParam=新的wchar_t[Parameters.size()+1];
如果(pwszParam==0)
{
返回1;
}
常量wchar_t*pchrTemp=Parameters.c_str();
wcscpy_s(pwszParam,Parameters.size()+1,pchrTemp);
/*CreateProcess API初始化*/
STARTUPINFOW siStartupInfo;
进程信息piProcessInfo;
memset(&siStartupInfo,0,sizeof(siStartupInfo));
memset(&piProcessInfo,0,sizeof(piProcessInfo));
siStartupInfo.cb=sizeof(siStartupInfo);
如果(CreateProcessW(const_cast(FullPathToExe.c_str()),
pwszParam,0,0,false,
创建默认错误模式,0,0,
&siStartupInfo和piProcessInfo)!=false)
{
/*观察过程*/
dwExitCode=WaitForSingleObject(piProcessInfo.hProcess,(SecondsToWait<0)?无限:(SecondsToWait*1000));
}
其他的
{
/*CreateProcess失败*/
iReturnVal=GetLastError();
}
/*空闲内存*/
删除[]pwszParam;
pwszParam=0;
/*释放手柄*/
CloseHandle(piProcessInfo.hProcess);
CloseHandle(piProcessInfo.hThread);
返回i返回值;
}
是的,我正在修改Minecraft,代码本身可以工作,所以我只能假设“不工作”是指第二个应用程序启动,但失败退出。当您从批处理文件执行此操作时,命令行末尾的
%*
将被删除,因为shell尝试将其扩展为环境变量(考虑%PATH%)。当您将其作为参数传递给CreateProcess
时,%*
将作为附加参数传递,并可能转发给recompile.py
。如果python脚本将%*
解释为文件名,它将无法找到该文件名,并将失败退出。问题不在于%*
。需要从E:\Modding\mcp\
调用python脚本。所以我只需要更改调用文件的路径 您可以始终只传递一个指向参数的字符串缓冲区的指针,因为您不需要保留它CreateProcess
最多只能修改字符串的null终止符。