用createprocess()创建子进程,子进程用settimer()一直等待。想用父进程结束掉该子进程。在创建子进程的时候,将子进程的句柄保存起来,在父进程里用TerminateProcess()结束子进程,结束不掉,用getlasterror()查看,输出error 288,Attempt to release mutex not owned by caller.不想用进程间通讯,让子进程自己退出,就是要用TerminateProcess()结束之。别外在该进程中用TerminateProcess(GetCurrentProcess(),GetExitCodeProcess(GetCurrentProcess(),&dexit))结束自己,无任何反应,用getlasterror()也无任何输出。

解决方案 »

  1.   


    //创建子进程代码,hcmd是父进程句柄,这里没用到
    bool stopprocess(HANDLE hCmd)
    { string scmdlineget="cmd /c D:\\Settimer\\Debug\\Settimer.exe";

    char *cmdlineget=new char[strlen(scmdlineget.c_str())+1];
    strcpy(cmdlineget,scmdlineget.c_str());

    STARTUPINFO si1; 
    PROCESS_INFORMATION pi1;

    ZeroMemory(&si1,sizeof(STARTUPINFO));
    si1.cb = sizeof(STARTUPINFO); 
    GetStartupInfo(&si1); 
    si1.wShowWindow = SW_SHOW;
    si1.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; if (!CreateProcess(NULL,cmdlineget,NULL,NULL,TRUE,NULL,NULL,NULL,&si1,&pi1))
    {
    MessageBox(NULL,"CreateProcess Failed!","提示",MB_OK | MB_ICONWARNING);  
    return 0;
    }                //hterminal在全局变量里定义的
    hterminal=pi1.hProcess;                //关闭Handle,就会出现句柄失效错误,所以给注释掉了
    //CloseHandle(pi1.hThread);
    //CloseHandle(pi1.hProcess);    return 1;
    }        //结束本进程,给注释掉了
    //DWORD dexit;
    //TerminateProcess(GetCurrentProcess(),GetExitCodeProcess(GetCurrentProcess(),&dexit));        //结束子进程
    DWORD dexit;
    TerminateProcess(hterminal,GetExitCodeProcess(hterminal,&dexit));

    cout<<"+++++++++++++++++"<<GetLastError()<<endl;
      

  2.   

    你确定你的hterminal的值为CreateProcess中的pi.hProcess?
      

  3.   

    你后面的TerminateProcess之前没有调用CloseHandle()来关闭pi.hProcess句柄吧
      

  4.   


    嗯,我输出了hterminal的值,是正确的。getlasterror()的错误是   “Attempt to release mutex not owned by caller”
      

  5.   


    代码里把这个注释掉了,调用CloseHandle()后,hterminal失效了。
      

  6.   

    函数调用的有问题,
    if(GetExitCodeProcess(hterminal,&dexit))
    {
       TerminateProcess(hterminal,dexit);
    }
      

  7.   


    我本来是想试试,用父进程创建一个子进程,就把子进程放那儿没管了。结束发现父进程执行完了,子进程没退出,父进程就一直在,所以就想用父进程来结束子进程。一直结束不掉,有问题就要解决它嘛,所以我就拿到csdn来探究咯。
      

  8.   


    还是getlasterror()的值还是288,求解,大牛们都来啊。
      

  9.   

    TerminateProcess是在什么地方调用的?
    父进程,还是其他进程?
    你给的信息太少,无法知道你为啥会出现288错误给出288错误的解释:
    (288)-企图释放并非呼叫方所拥有的多用户终端运行程序
      

  10.   

    TerminateProcess()是在父进程里调用的。我把cmd /c去掉看看先
      

  11.   

    搞定了,是  cmd /c引起的,看来CreateProcess创建的子进程,加了cmd /c后,pi.processid句柄为cmd /c的句柄,不为子进程的。嘿嘿,谢谢shenyi0106,你翻译过来的这个“多用户终端”提醒了一下我。