使用 CreateProcess windows API 启动 bat 文件

Launching a bat file using CreateProcess windows API

我写了一个 bat 文件,当从命令提示符启动时它工作正常。现在我已经使用“CreateProcess”编写了一个小的 C++ 程序来从 C++ 程序启动 bat 文件。 C++ 程序采用 2 个命令行参数。一个是要执行的 bat 文件的路径,另一个是将写入 bat 文件输出的文件的路径。我正在启动如下流程

   DWORD processflags =
        CREATE_DEFAULT_ERROR_MODE
        //| CREATE_NEW_CONSOLE
        | CREATE_NO_WINDOW
        ;


//security attribute
    SECURITY_ATTRIBUTES securityAttr;
    securityAttr.bInheritHandle = TRUE;
        securityAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
        securityAttr.lpSecurityDescriptor = NULL;

    HANDLE fileHandleforChildProcessTowrite,fileHandleforChildProcessToRead, fileHandleforChildProcessToErr 

     fileHandleforChildProcessTowrite = CreateFile(logfilepath, FILE_SHARE_WRITE, 0, &securityAttr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

  //STARTUP INFO
    STARTUPINFO sinfo;
    ZeroMemory(&sinfo, sizeof(STARTUPINFO));
        sinfo.cb = sizeof(STARTUPINFO);
        sinfo.dwFlags = STARTF_USESTDHANDLES;
        sinfo.hStdOutput = fileHandleforChildProcessTowrite;
        sinfo.hStdInput = fileHandleforChildProcessToRead;

        sinfo.hStdError = fileHandleforChildProcessToErr;

    if (!CreateProcess(NULL,   // No module name (use command line)
            command,        // bat file to be run
            &securityAttr,            
            NULL,          
            TRUE,          // Set handle inheritance to TRUE/FALSE
            processflags,              // No creation flags
            NULL,           // Use parent's environment block
            NULL,           // Use parent's starting directory 
            &sinfo,            // Pointer to STARTUPINFO structure
            &pifo)           // Pointer to PROCESS_INFORMATION structure
            )
        {
            printf("CreateProcess failed (%d).\n", GetLastError());
            return PROCESS_CREATION_FAILED;
        }


  

    // Wait until child process exits.
        WaitForSingleObject(pi.hProcess, INFINITE);

//Rest of the code follows to clean up logic to close process and file handles

我在这里面临的问题是,当我将 bInheritHandles 参数设置为 FALSE 的 createProcess 批处理文件执行正常但没有 bat 文件输出将写入预期的文件句柄但是当我将 bInheritHandles 参数设置为 TRUE bat文件执行失败,我在日志中收到以下警告消息

The process cannot access the file because it is being used by another process.

有人可以帮我解决这个问题吗?为什么 bInheritHandles 设置为 TRUE 时 bat 文件执行失败,但如果该标志为 false 则工作正常?由于显而易见的原因,我无法共享完整的 bat 文件,请原谅。

使用 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE 作为 dwShareMode 参数 CreateFile API 作为文件句柄解决了问题

CreateFile(filehandlepate, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, &secureAttr, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);