|
@@ -107,18 +107,8 @@ DWORD __stdcall CScriptExecutor::_LogExportThread(LPVOID lpParam)
|
|
|
CloseHandle(that->m_hLogThread);
|
|
|
that->m_hLogThread = NULL;
|
|
|
|
|
|
- // 关闭重定向句柄;
|
|
|
- if (that->m_hStdErrorWrite)
|
|
|
- CloseHandle(that->m_hStdErrorWrite);
|
|
|
- that->m_hStdErrorWrite = NULL;
|
|
|
-
|
|
|
- if (that->m_hStdOutWrite)
|
|
|
- CloseHandle(that->m_hStdOutWrite);
|
|
|
- that->m_hStdOutWrite = NULL;
|
|
|
-
|
|
|
- if (that->m_hStdOutRead)
|
|
|
- CloseHandle(that->m_hStdOutRead);
|
|
|
- that->m_hStdOutRead = NULL;
|
|
|
+ // 结束重定向;
|
|
|
+ that->EndRedirectStdOut();
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -173,6 +163,9 @@ int CScriptExecutor::RedirectStdout(LPSTARTUPINFO si /*=NULL*/)
|
|
|
}
|
|
|
_close(wpfd);
|
|
|
|
|
|
+ // 备份进程原始标准输出;
|
|
|
+ m_hOldStdOutWrite = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
|
+ // 设备进程标准输出,重定向到管道中;
|
|
|
if (!SetStdHandle(STD_OUTPUT_HANDLE, m_hStdOutWrite))
|
|
|
{
|
|
|
printf("Error:重定向失败\n");
|
|
@@ -535,6 +528,41 @@ BOOL CScriptExecutor::EndSubprocess()
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+void CScriptExecutor::EndRedirectStdOut()
|
|
|
+{
|
|
|
+ // 关闭重定向句柄;
|
|
|
+ if (m_hStdErrorWrite)
|
|
|
+ CloseHandle(m_hStdErrorWrite);
|
|
|
+ m_hStdErrorWrite = NULL;
|
|
|
+
|
|
|
+ if (m_hStdOutWrite)
|
|
|
+ {
|
|
|
+ // 嵌入进程脚本;
|
|
|
+ if ( m_nRunType == EMBEDDED && m_hOldStdOutWrite)
|
|
|
+ {
|
|
|
+ // 恢复进程默认标准输出;
|
|
|
+ int fd = _open_osfhandle((intptr_t)m_hOldStdOutWrite, _O_TEXT);
|
|
|
+ if ( _dup2(fd, _fileno(stdout)) == 0)
|
|
|
+ {
|
|
|
+ _close(fd);
|
|
|
+ // 设置标准输出;
|
|
|
+ SetStdHandle(STD_OUTPUT_HANDLE, m_hOldStdOutWrite);
|
|
|
+ m_hOldStdOutWrite = NULL;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ printf("Error:_dup2分配文件描述符失败\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ CloseHandle(m_hStdOutWrite);
|
|
|
+ }
|
|
|
+ m_hStdOutWrite = NULL;
|
|
|
+
|
|
|
+ if (m_hStdOutRead)
|
|
|
+ CloseHandle(m_hStdOutRead);
|
|
|
+ m_hStdOutRead = NULL;
|
|
|
+}
|
|
|
+
|
|
|
void CScriptExecutor::InitScript(std::string strScript, std::string strLogPath, std::string strScriptCmd, int nRunType /*= PY_RUN_TYPE::EMBEDDED*/)
|
|
|
{
|
|
|
// 判断脚本是否存在;
|