本帖最后由 shiweifu 于 2010-05-29 09:03:09 编辑

解决方案 »

  1.   

    我没有做过,不过我看你的程序也不对。在子进程中,HANDLE hFile = (HANDLE)argv[1];是如何来的?argv[1]怎么可能刚好就是父进程中的HANDLE hFile;?
      

  2.   

    按照书上说的,进程中维护了一个句柄表。
    在设置了权限属性之后,子进程继承了父进程的句柄表,他们其中所在的内存地址是相同的。也就是说是可以访问的,我觉得可能是这么传值不对书中给出的继承方式有两种:
    1、通过启动参数
    2、通过环境变量我觉得貌似是指的不对,该弄sprintf赋值?
      

  3.   

    首先在父进程中,文件句柄是转换成字符串后传到子进程中去的,那么到了子进程中,它就是一个字符串,需要将其再转换成整数才能使用.在父进程中是用16进制转化的,子进程也用16进制转化回来.
    再一个就是你在父进程的这种给子进程传递参数的方式,要得到pline指向的字符串,在子进程中要使用argv[0]而不是argv[1].你可以试试.
      

  4.   

    LZ边学习边实践,精神可嘉.帮LZ调试了下,修改这2个错误就可以了.
    1. char pline[sizeof(HANDLE)];
       sprintf(pline," %x",hFile);
    这里多了个空格, 缓冲越界了,这样改
    sprintf(pline,"%u",hFile);2. 就是上面说的问题,index应该是0, 传入参数是字符串,要转成句柄:
     HANDLE hFile = (HANDLE)atoi(argv[0]);//HANDLE hFile = (HANDLE)argv[1];
      

  5.   

    1. char pline[sizeof(HANDLE)];
      sprintf(pline," %x",hFile);
    多了个空格把空格
    2. 然后
    char* testr;
    HANDLE hFile =(void*)strtol(argv[1],&tertr,16);
    就可以用这个继承下来的文件句柄了。祝你成功!
      

  6.   

    please debug first before you have problem
      

  7.   

    HANDLE hFile = (HANDLE)argv[1];这个地方要把字符串转换成HANDLE