This is a dll that exports a function called Wait(). Wait() is similiar with WinExec().
The difference is that Wait()
run an application and return until the application ends.
This project consists of 3 functions:
Wait()
Create a thread and wait for an event. Use pThreadEvent to
identify if the called application ends. WaitForSingleObject()
pauses the application and waits for the called application to
end.
_declspec(dllexport) BOOL Wait(CString szCmdLine)
{
LPTHREADINFO pThreadInfo = new THREADINFO;
CEvent *pThreadEvent = new CEvent(FALSE, TRUE);
ASSERT_VALID(pThreadEvent);
if(pThreadInfo)
{
pThreadInfo->pTermThreadEvent =
pThreadEvent;
pThreadInfo->strPathName = szCmdLine;
AfxBeginThread(LaunchAndWait, pThreadInfo);
WaitForSingleObject(pThreadEvent->m_hObject,
INFINITE);
return TRUE;
}
return FALSE;
}
LaunchAndWait()
Call LaunchApplication() to run the application and wait for an
event.WaitForMultiObjects() wait for either the called application to end or the main
process to end.
UINT LaunchAndWait(LPVOID pParam)
{
LPTHREADINFO pThreadInfo = (LPTHREADINFO) pParam;
PROCESS_INFORMATION stProcessInfo;
if(LaunchApplication(pThreadInfo->strPathName, &stProcessInfo))
{
HANDLE hThreads[2];
hThreads[0] =
pThreadInfo->pTermThreadEvent->m_hObject;
hThreads[1] = stProcessInfo.hProcess;
DWORD dwIndex = WaitForMultipleObjects(2,
hThreads, FALSE, INFINITE);
CloseHandle(stProcessInfo.hThread);
CloseHandle(stProcessInfo.hProcess);
pThreadInfo->pTermThreadEvent->SetEvent();
if(pThreadInfo)
delete pThreadInfo;
}
else
pThreadInfo->pTermThreadEvent->SetEvent();
return 0;
}
LaunchApplication()
Call CreateProcess to run the application.
BOOL LaunchApplication(LPCTSTR pCmdLine,
PROCESS_INFORMATION *pProcessInfo)
{
STARTUPINFO stStartUpInfo;
memset(&stStartUpInfo, 0, sizeof(STARTUPINFO));
stStartUpInfo.cb = sizeof(STARTUPINFO);
stStartUpInfo.dwFlags = STARTF_USESHOWWINDOW;
stStartUpInfo.wShowWindow = SW_SHOWDEFAULT;
return CreateProcess(NULL, (LPTSTR)pCmdLine, NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL,
NULL, &stStartUpInfo, pProcessInfo);
}