用一个CreateProcess建一个进程,找开一个windows程序,怎么能比较安全的关闭它。ExitProcess与TerminateProcess都会有内存泄露,最好的办法我想是发一个消息,让它自己关闭。但是进程之间的消息怎样来发??手头没有资料,SDK的帮助又不太好查找,请大家多多帮忙,谢谢!

解决方案 »

  1.   

    找到它的主窗口,SendMessage就可以了啊
      

  2.   

    先用FindWindow找到要关闭的程序的主窗口,再向它发送WM_CLOSE。
      

  3.   

    你既然用CreateProcess,那么就有他的handle,向其发送wm_close消息即可
      

  4.   

    那么就有他的handle,向其发送wm_close消息即可???SendMessage需要的是hwnd,FindWindow?能不能给个例子?
      

  5.   

    试过了,用PostThreadMessage(dwThreadId,WM_DESTROY,0,0)没有作用,其中的dwThreadId是createProcess中传回的PROCESS_INFORMATION中的值,很奇怪:(
      

  6.   

    用FindWindow找到要关闭的程序的主窗口,再向它发送WM_CLOSE。
      

  7.   

    OK解决了用PostThreadMessage(dwThreadId,WM_QUIT,0,0),呵呵,不好意思!对了谁能讲一讲这WM_QUIT与WM_DESTROY的区别,我是真的没明白!有兴趣的讲一下,这方面的东东吧!
      

  8.   

    创建一个UI线程(可以把线程的主窗口隐藏起来),记住这个窗口的HWND。要终止这个线程,只要Destroy这个线程的主窗口。
      

  9.   

    WM_CLOSE没有用!不过不知为什么?PCMAN1900,你说得太深奥,不懂,能说明白一点吗?
      

  10.   

    线程有两种:一种是worker线程(worker thread),一种是UI线程(user-interface thread)。前者没有窗口界面,处理完任务后自己就会返回;后者是带主窗口的,把这种线程的主窗口Destroy掉,线程也就结束了。
      

  11.   

    可以自己定义一个消息
    const UINT WM_MsgMapped = RegisterWindowMessage("ThreadNum")
    然后在MFC消息定义中手动添加一个消息相应函数
    ON_REGISTERED_MESSAGE(WM_MsgMapped,OnRegMsgMapped)
    在你发消息的程序里
    UINT m_nMsgMapped;
    m_nMsgMapped=RegisterWindowMessage("ThreadNum");
    SendMessage(pWndGet,m_nMsgMapped,0,(LONG)dwThreadNum)查找窗口
    HWND pWnd = ::FindWindowEx(NULL,NULL, NULL,_T(你程序的窗口的名字));
     
       if(IsWindow(pWnd)) 
    ::SendMessage(pWnd,WM_CLOSE,0,0);
      

  12.   

    进程间通信,有数不胜数的办法,比较偏远一点的办法有:创建一个字符串的ATOM,然后另外一个进程访问这个Atom就能拿到这个字符串;命名管道技术;PostThreadMessage,早期16位的全局共享内存;文件;Socket;同步对象;发送窗口消息;钩子函数;替换目标进程窗口过程等等。
    这个问题总是在找工作面试的时候被考,各位记住吧。
      

  13.   

    谢谢各位,但是对于一个已经是别人做到的程序,我想在程序中调用它,然后调用之后想关闭它,这一种情况,还有哪一些的处理方法?另一个问题,如果我调用的是一个DOS下已经写好的程序,我怎样能从中得到它在屏幕上的输出(我不想开一个DOS窗口)而是自己在自己的窗口中来显示?
      

  14.   

    使用函数CreateProcess,然后设置参数STARTUPINFO中的HANDLE  hStdInput; 
    HANDLE  hStdOutput; 
    HANDLE  hStdError;参数,这几个变量指向你的句柄就可以了,可以使用命名管道,接受它的输出.