使用 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);
我写了一个 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);