我们知道跨进程共享内核对象有三种方式:
1.对象句柄继承
2.对象命名
3.对象句柄拷贝为什么用继承方式时,子进程内核对象句柄表中内核对象句柄不仅所有值与父进程中的一样,而且
表项位置也要一样?(对于那些被共享的句柄而言)而用对象命名方式的时候,如果进程A已经创建一个内核对象名为objectname,那么当进程B调用Create*(...,TEXT("objectname"))函数时,如果一切顺利,“系统在新进程的句柄表中找出一个空项目,并对该项目进行初始化,使
该项目指向现有的内核对象”,也就是objectname了,但后面又强调
“请注意,这两个进程中的句柄值很可能是不同的值。这是可以的。Process A将使用它的句柄值,而Process B 则使用它自
己的句柄值来操作一个互斥内核对象。”这使我很费解,既然命名对象方式时可以这么做,为什么对象句柄继承方式中非要一模一样不可呢?
请高人指点指点。

解决方案 »

  1.   

    因为使用命名对象时,后一个进程的句柄表里对应的位置也许已经占用了。
    比如:
    进程B创建了10个句柄,HANDLE各是1, 2, 3, ...., 9, 10
    进程A创建了一个命名对象,句柄是3。
    进程B打开这个命名对象,得到一个句柄,因为3这个位置上已经有句柄了,所以不能放在3个,只能随便放在其他位置,比如11继承的时候,因为此时子进程刚要初始化,还没有创建任何句柄,因此所有的句柄位置都是空闲的,所以可以使用父进程的句柄相同的位置。
      

  2.   

    我也是刚看的Windows核心编程不久我的理解是,句柄继承,要达到的目的是父进程的句柄传给子进程后也能使用,所以索引要一样,因为句柄值就是索引值嘛。实现这个的方法就是我上面说的那样。而命名对象之后,系统是通过对象名称来定位对象的,系统内核来维护这个名称和对象的映射关系,所以没有必要要求索引值也一样。
      

  3.   

    恩,有道理,不过我觉得既然可以让不同进程的句柄表中的entrys指向相同的内核对象,并且这些entrys本身就可能不同,也就没有必要再开辟继承方式中的机制了。
    不知道是否用更深的用意啊,有待研究
      

  4.   

    不知道这句红色表明的语句是否也是一种可能,不过如果句柄值就是索引值的话(虽然书上这么说),红色注明的这句倒是有点矛盾了,因为这时仍然是通过句柄来访问对象的啊。除非通过Open*(... , pszName)和Create*(... , pszName)函数返回的句柄值并不是实际表项中的值。
    唉,希望读到下面的时候可以更加明了一些。
      

  5.   

    使用命名对象是方便共享啊,Open*, Create*后还是要用句柄的嘛不管那种继承,最终都是会给进程的句柄表中添加一个项目,只是这个这个项目获得的方法不同而已。和你讨论了一下,我现在的理解反倒比以前加深了。
      

  6.   

    恩,一同探讨吧,这本Windows核心编程着实不错,得好好学习学习。