LPPROCESS_INFORMATION字段MSDN帮助中说:
Handles in PROCESS_INFORMATION must be closed with CloseHandle when they are no longer needed.
那么我想问一下,我如果直接点击那个被创建的可执行程序窗口上的关闭按钮,是不是就不用再调用CloseHandle了?
MSDN之所以要求这个操作,是不是因为有的被创建的是没有窗口的?

解决方案 »

  1.   

    MFC之所以要求这个操作,并不是因为有的被创建的是没有窗口的
    所以即使你直接点击关闭按钮,按照常理也需要调用CloseHandle
      

  2.   

    理解错了,CloseHandle是关闭句柄,不是关闭应用程序的窗口
     In general, CloseHandle invalidates the specified object handle, decrements the object's handle count, and performs object retention checks. After the last handle to an object is closed, the object is removed from the system. 
      

  3.   

    我似乎有点明白了,CreateProcess就是申请了一个内核资源,如果仅仅点那个被创建的可执行程序的关闭按钮,那么创建那个可执行程序的线程就得不到通知,就无法释放资源了。是这样理解吗?
      

  4.   

    哎呀,引用错了,我想引用的是2楼VisualEleven的回复
      

  5.   

    通过调用CloseHandle()告知操作系统,已经完成了对某一内核对象的操作,该函数首先检查调用进程的句柄表,来确认进程是否对该句柄所指向的对象有访问权,如果句柄无效则返回FALSE,如果有效,系统将得到该内核对象的数据结构的地址,把结构中的使用计数成员减1,如果计数变为0,则将从内核中释放该内核对象。  如果计数还未到0,就意味着还有其他的进程在使用这个内核对象,那么它就不会被释放。  
      

  6.   

    我觉得Q342210738没说明白,VisualEleven的答复还是没让我理解问题的根本啊。
    在lpProcessInformation中存储的难道不是那个被创建的应用程序的信息?点击那个被创建的应用程序的关闭按钮,它自己难道不会关闭自己的hProcess和hThread?CreateProcess打开的应用程序跟直接打开的应用程序在关闭时不一样?
    我知道点击关闭按钮只是关闭窗口,但是正常打开应用程序的话,他就会关闭该应用程序的hProcess和hThread。为什么CreateProcess打开的应用程序在点击关闭按钮后还要CloseHandle呢?
    这个“Handles in PROCESS_INFORMATION ”不就是hProcess和hThread嘛。
    如果我以上的理解有问题,还请各位要解答清楚啊,在这里我先谢谢了!
      

  7.   

    调用CreateProcess()创建进程的时候,系统为每个对象赋予一个初始使用计数值1。然后,在CreateProcess函数返回之前,该函数打开进程对象和线程对象,并将每个对象的与进程相关的句柄放入PROCESS_IN FORMATION结构的hProcess和hThread成员中。当CreateProcess在内部打开这些对象时,每个对象的使用计数就变为2。在系统能够释放进程对象前,该进程必须终止运行(将使用计数递减为1),并且父进程必须调用CloseHandle(再将使用计数递减1,使之变为0)。同样,若要释放线程对象,该线程必须终止运行,父进程必须关闭线程对象的句柄。
      

  8.   

    非常感谢VisualEleven耐心的解答,我明白了,我再去好好看看《Windows核心编程》。