Search code examples
c++visual-studio-2010terminateshellexecute

TerminateProcess() doesn't close the application


I am trying to use the TerminateProcess to terminate an app launched by ShellExecuteEX like this:

SHELLEXECUTEINFO ExecuteInfo;
ExecuteInfo.fMask = SEE_MASK_FLAG_NO_UI; /* Odd but true */
ExecuteInfo.hwnd = NULL;
ExecuteInfo.cbSize = sizeof(ExecuteInfo);
ExecuteInfo.lpVerb = NULL;
ExecuteInfo.lpFile = "http://www.microsoft.com";
ExecuteInfo.lpParameters = "";
ExecuteInfo.lpDirectory = NULL;
ExecuteInfo.nShow =  SW_SHOW;;
ShellExecuteEx(&ExecuteInfo);
//WaitForSingleObject(ExecuteInfo.hProcess, 0);
Sleep(4000);
TerminateProcess(ExecuteInfo.hProcess, 0);

IE gets opened but it never closes. Am I doing something wrong?


Solution

  • According to MSDN, fMask must be set to SEE_MASK_NOCLOSEPROCESS for .hProcess to get set. I would add a test to see if it is NULL. As a side note I've always had better luck using CreateProcess.

    Edit:

    This is how you do it using CreateProcess:

    PROCESS_INFORMATION pi = {0};
    STARTUPINFO si = {0};
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_SHOW;
    
    
    CreateProcess(  NULL,
                    "C:\\Program Files\\Internet Explorer\\iexplore.exe http://www.google.com/",
                    NULL,
                    NULL,
                    FALSE,
                    NORMAL_PRIORITY_CLASS,
                    NULL,
                    NULL,
                    &si,
                    &pi );
    
    
    Sleep(4000);
    TerminateProcess(pi.hProcess, 0);
    

    You should add error-checking and could query the path of the default browser using: AssocQueryString like this: AssocQueryString(0,ASSOCSTR_EXECUTABLE,"http","open", szExe, &cchExe);