子进程如何使用从父进程继承过来的句柄??
谢谢~~

解决方案 »

  1.   

    可以指定属性;
    首先,当父进程创建内核对象时,必须向系统指明,它希望对象的句柄是个可继承的句柄。请记住,虽然内核对象句柄具有继承性,但是内核对象本 身不具备继承性。若要创建能继承的句柄,父进程必须指定一个S E C U R I T Y _ AT T R I B U T E S 结构并对它进行初始化,然后将该结构的地址传递给特定的C r e a t e 函数。下面的代码用于创建一个互斥对象,并将一个可继承的句柄返回给它:    SECURITY_ATTRIBUTES sa;
       sa.nLength = sizeof(sa);
       sa.lpSecuntyDescriptor = NULL;
       //Make the returned handle inheritable.
       sa.bInheritHandle =- TRUE; 
       HANDLE hMutex = CreateMutex(&sa, FALSE, NULL);
    该代码对一个S E C U R I T Y _ AT T R I B U T E S 结构进行初始化,指明该对象应该使用默认安全性(在Windows 98 中该安全性被忽略)来创 建,并且返回的句柄应该是可继承的。
      

  2.   

    父进程创建子进程时使用CreateProcess()时将bInheriteHandle设为TRUE。这样,系统将把父进程中可继承的句柄的项目复制到子进程的句柄表中,同时增加对象的引用计数。在父子进程中,标识内核对象所用的句柄值是完全一样的。    对象句柄的继承性有个特征:当使用它时,子进程不知道它已经继承了任何句柄。子进程为了确定它期望的内核对象的句柄值,最常用的方法是将句柄值作为一个命令参数递给子进程。该子进程的初始化代码对命令行进行分析(如用sscanf()),并取出句柄。可以这样做的原因是父子进程中共享内核对象的句柄值是一样的。
        其它的方法如父进程等待子进程完成初始化(使用WaitForInputIdle()),然后发送一条消息给子进程的某线程。
        第三种方法是父进程将一个环境变量加到环境程序块中。该变量的名字是子进程知道要查找的某种信息,而变量的信息则是内核对象要继承的值。可以用GetEnviromentVariable()获取环境变量。
        总之,父进程要把句柄值传递给子进程。例如楼上的hMutex,子进程得到它的值后,可以直接WaitForSingleObject(hMutex,...),而不用再去CreateMutext或OpenMutex