Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-在不使用系统从批处理文件转换的情况下运行程序_C++_Python_Process_Minecraft - Fatal编程技术网

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终止符。