Knowledge Base Nr: 00023 StartProcess.cpp - http://www.swe-kaiser.de

Downloads: C++-Klassen (ProcessSupport)

Win32: Prozess starten mit Timeout-Überwachung (Terminierung des Processes)

  
/* CreateProcess() verhält sich manchmal etwas unverständlich:
bei einigen Programmen muss man den Programmnamen als commandline-parameter
nochmal mitgeben bei anderen darf man es nicht?!
Einige Prozesse funktionieren nur wenn sie über WinExec() aufgerufen werden
(z.B. Internet Explorer mit URL-Angabe).

createprocess funzt nicht - winexec tuts!
da nicht registriert kommt bei createprozess eine messagebox.
winexec scheint mehr einem aufruf von der console zu entsprechen
createprocess einem aufruf aus dem explorer?!

sprintf(szText, "\"c:/program files/thumbnailer/THUMB5.exe\" "
"/h /f %s %s /r 6 /o 4" , szFileFrom, szFileTo);
klappt nicht:
int nErr = g_supp.RunProcess("c:/program files/thumbnailer/THUMB5.exe"
, szText, TIMEOUT_MS);
klappt:
int nErr = WinExec(szText, SW_HIDE);
*/


int CProcessSupport::RunProcess(const char* lpszProcess, const char* lpszCmdLine, int nTimeout_ms, int nShowWindow)
{
STARTUPINFO startup;
ZeroMemory (&startup,sizeof(startup));
startup.cb = sizeof(STARTUPINFO);
startup.dwFlags = STARTF_USESHOWWINDOW;
startup.wShowWindow = nShowWindow;

PROCESS_INFORMATION PInfo;

char szCmd[300];
sprintf(szCmd, "%s %s", lpszProcess, lpszCmdLine);

if (CreateProcess(lpszProcess, szCmd, NULL, NULL
, FALSE, 0, NULL, NULL, &startup, &PInfo))
{
if (nTimeout_ms > 0)
{
if (WaitForSingleObject (PInfo.hProcess, nTimeout_ms) == WAIT_TIMEOUT) //10 minutes
{
//Prozess beenden
if (!TerminateProcess(PInfo.hProcess,0))
printf(LOGERR, "Timeout bei TerminateProcess() auf %s %s\n", lpszProcess, lpszCmdLine);
return PS_TIMEOUT;
}
}
}
else
{
DWORD dwRet = GetLastError();
printf(LOGERR, "Fehler %lu beim Starten '%s %s'\n", dwRet, lpszProcess, lpszCmdLine);

char szError[300];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_MAX_WIDTH_MASK
, NULL, dwRet, 0, szError, sizeof(szError), NULL);
printf(LOGERR, "%s\n", szError);

return PS_CREATE_ERROR;
}

return PS_OK;
}