解决方案 »

  1.   

    ShellExecute的返回值不是真正的句柄,msdn上ShellExecute的文档里写了:The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. It can be cast only to an int and compared to either 32 or the following error codes below.如果用ShellExecuteEx,那里面的hProcess应该对应Process的Handle
      

  2.   

    ps[0].Handle返回是进程的句柄 也就是 程序的实例句柄这样理解对吗?
      

  3.   


    或者说用ShellExecute开启一段exe程序,然后用什么函数可以关闭这个exe程序?
      

  4.   

    进程的句柄和“实例句柄”不一样,说起来有些复杂,所谓“实例句柄”,也就是HINSTANCE,现在和HMODULE代表一个东西,就是dll或者exe被载入内存的虚拟地址。唯一代表了一个进程的虚拟地址空间内加载的image。这个和进程的句柄不是一个概念,进程的句柄是全局唯一的,代表一个进程,你可以在其它进程用这个句柄操作目标进程。而“实例句柄”不是全局唯一的,它只是一个进程内部的信息,在进程内部使用这个句柄是有效的,比如获取某个导出函数的地址,或者加载资源等等。但是在其它进程就算拿到这个句柄也不能直接操作,因为在其它进程这个句柄没有任何意义。更何况ShellExecute返回的值连“实例句柄”都不是。在很久之前16位windows系统里进程没有虚拟地址空间的时候,这个“实例句柄”代表了程序所在的内存物理地址,所以是唯一的,所以ShellExecute返回了那个值,但是现在因为没有意义了,那个返回值就用来当作错误代码了。
    可以用ShellExecuteEx,它可以返回进程的句柄,然后就能使用各种方式kill了
      

  5.   

    你好,多谢不吝言辞,回答这么多,呵呵,我现在使用了Process.Start(fileName, arguments);这种方式开启的进程。“一个进程的虚拟地址空间内加载的image”这句话能解释下他后面的背景知识吗?进程会有4GB的虚拟地址空间指的是什么意思?image指什么?
    多谢了,正接触微软的C#,不懂的太多。
      

  6.   

    这些是操作系统基础知识,和c#没什么关系,你可以找本讲操作系统的书看看。虚拟内存是操作系统隔离进程的一种措施,把原本是共享的内存让进程以为是自己独享的,操作系统来管理虚拟-物理地址映射和内存-磁盘交换。这样程序的开发就会容易很多,不用担心自己的内存地址和其它进程会有冲突。32位进程有4G的地址空间,高2G操作系统保留,低2G给程序用。image或者说“映像”一般是指包含可执行代码,可以被操作系统加载映射到内存中的文件,比如.exe,.dll之类。被操作系统加载到进程的内存空间时会有个起始地址,HINSTANCE和HMODULE就是这个地址。
      

  7.   

    唉,说了那么多,其实呢:
    Process p = Process.Start(ps);p.Kill();
      

  8.   

    正解
    你在启动进程的时候就保留这个句柄,然后kill的时候就可以直接用了
    而不是启动的时候将它丢弃,然后要kill的时候想破头的去找