source code: HANDLE hReadPipe;
HANDLE hWritePipe;
SECURITY_ATTRIBUTES Security_Attributes;
Security_Attributes.nLength=sizeof(SECURITY_ATTRIBUTES);
Security_Attributes.lpSecurityDescriptor=NULL;
Security_Attributes.bInheritHandle=TRUE;
CreatePipe(&hReadPipe, &hWritePipe, &Security_Attributes, 0); STARTUPINFO StartupInfo;
GetStartupInfo(&StartupInfo);
// StartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; //removed for strange bug
StartupInfo.wShowWindow = SW_HIDE;
StartupInfo.hStdOutput = hWritePipe;
StartupInfo.hStdError = hWritePipe;
StartupInfo.hStdInput = hReadPipe; PROCESS_INFORMATION ProcessInfor = {0};
if(!CreateProcess(NULL, strCmdLine.GetBuffer(0),
NULL,NULL,TRUE,
CREATE_SUSPENDED,NULL,NULL,
&StartupInfo,&ProcessInfor))
{
MessageBox(_T("Can't run ffmpeg.exe, Check if missing."), _T("Error"));
return FALSE;
}
DWORD ProcessTime = GetTickCount();
ResumeThread(ProcessInfor.hThread);
m_isExitReady = FALSE;
DWORD SizeRead;
TCHAR OutputData[4096];
DWORD TotalBytesAvail;
DWORD BytesLeftThisMessage;
MSG msg;
m_cProgress.SetRange(0, 1000);
m_cProgress.SetStep(1);
#ifdef ENABLE_LOG
CFile LogFile;//create log file if needed
LogFile.Open("converter.log", CFile::modeCreate|CFile::modeWrite);
#endif //ENABLE_LOG
do
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(PeekNamedPipe(hReadPipe, OutputData, 4096, &SizeRead,
&TotalBytesAvail, &BytesLeftThisMessage))
{
//get wanted data here.
#ifdef ENABLE_LOG
LogFile.Write(OutputData, SizeRead);
#endif //ENABLE_LOG
}
m_cProgress.StepIt();
}
while(WaitForSingleObject(ProcessInfor.hProcess, 10) != WAIT_OBJECT_0);
#ifdef ENABLE_LOG
LogFile.Close();
#endif //ENABLE_LOG
m_cProgress.SetPos(1000);
CloseHandle(ProcessInfor.hProcess);
CloseHandle(ProcessInfor.hThread);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
m_isExitReady = TRUE;
ProcessTime = GetTickCount() - ProcessTime;
m_ProcessTime.Format("Cost %d ms", ProcessTime);
UpdateData(FALSE);
return CheckOutput();
HANDLE hWritePipe;
SECURITY_ATTRIBUTES Security_Attributes;
Security_Attributes.nLength=sizeof(SECURITY_ATTRIBUTES);
Security_Attributes.lpSecurityDescriptor=NULL;
Security_Attributes.bInheritHandle=TRUE;
CreatePipe(&hReadPipe, &hWritePipe, &Security_Attributes, 0); STARTUPINFO StartupInfo;
GetStartupInfo(&StartupInfo);
// StartupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; //removed for strange bug
StartupInfo.wShowWindow = SW_HIDE;
StartupInfo.hStdOutput = hWritePipe;
StartupInfo.hStdError = hWritePipe;
StartupInfo.hStdInput = hReadPipe; PROCESS_INFORMATION ProcessInfor = {0};
if(!CreateProcess(NULL, strCmdLine.GetBuffer(0),
NULL,NULL,TRUE,
CREATE_SUSPENDED,NULL,NULL,
&StartupInfo,&ProcessInfor))
{
MessageBox(_T("Can't run ffmpeg.exe, Check if missing."), _T("Error"));
return FALSE;
}
DWORD ProcessTime = GetTickCount();
ResumeThread(ProcessInfor.hThread);
m_isExitReady = FALSE;
DWORD SizeRead;
TCHAR OutputData[4096];
DWORD TotalBytesAvail;
DWORD BytesLeftThisMessage;
MSG msg;
m_cProgress.SetRange(0, 1000);
m_cProgress.SetStep(1);
#ifdef ENABLE_LOG
CFile LogFile;//create log file if needed
LogFile.Open("converter.log", CFile::modeCreate|CFile::modeWrite);
#endif //ENABLE_LOG
do
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if(PeekNamedPipe(hReadPipe, OutputData, 4096, &SizeRead,
&TotalBytesAvail, &BytesLeftThisMessage))
{
//get wanted data here.
#ifdef ENABLE_LOG
LogFile.Write(OutputData, SizeRead);
#endif //ENABLE_LOG
}
m_cProgress.StepIt();
}
while(WaitForSingleObject(ProcessInfor.hProcess, 10) != WAIT_OBJECT_0);
#ifdef ENABLE_LOG
LogFile.Close();
#endif //ENABLE_LOG
m_cProgress.SetPos(1000);
CloseHandle(ProcessInfor.hProcess);
CloseHandle(ProcessInfor.hThread);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
m_isExitReady = TRUE;
ProcessTime = GetTickCount() - ProcessTime;
m_ProcessTime.Format("Cost %d ms", ProcessTime);
UpdateData(FALSE);
return CheckOutput();
解决方案 »
- 定义了一个公共函数,传参数有点问题
- 在Delphi中如何修改目标进程的汇编代码?
- 弱问Delphi的日期在内存中的格式问题
- 关于Ado连接数据库问题!急救!!!!!!
- 用FASTREPORT做报表,你们的网格线都是怎么做的啊,不会是划的网格吧?
- 帮我转c语言delphi语言给100分
- 用过VCLzip控件的请进
- 救急救急!TCheckListBox问题
- 如何把EDIT1和BitBtn1Click联系起来?
- dxDBGrid控件高分求教!!!!
- delphi用ado连接mysql数据库,往表里写中文数据时发生错误。怎么解决
- leftbstr 这个函数,怎么写,我是用D6,碰到这个函数编译失败,谁能告诉这个函数怎么写的?
获取、保存、检查(CheckOutput)这个程序的输出