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();