我想在多个进程之间共享一个结构体链表,想用MapViewOfFileEX来确定链表的头结点,从而共享整个链表。这里怎么用MapViewOfFileEX的最后一个参数?

解决方案 »

  1.   

    《WINDOWS核心编程》一书的第17章即429页。我总不理解怎么用MapViewOfFileEX来共享链表。退后一步,我不用链表,而用内存映射文件来共享一个连续的可变长的结构体数组(结构体中包含字符数组,联合体,和指向另一结构体的指针),我又能做到吗?
      

  2.   

    你得把整个链表结点防到FileMappingObject 里去才行如果MapViewOfFileEx 调用成功,那么它返回的值就是lpBaseAddress(重复参数是为了兼容MapViewOfFile),估计这样该你能明白了吧
    对lpBaseAddress 的前提性要求是它必须是系统存储管理中页面大小(4K byte)的整数倍。如果lpBaseAddress 不是整数倍,函数一定会失败
      

  3.   

    我还不明白,请看下面一段简单的代码:
    Device3=(struct Device *)MapViewOfFileEx(h_file,
      FILE_MAP_ALL_ACCESS,
      0,
      0,
      0,
      (PVOID*)0x80000000);
    int x=0x80000000;
    int y=0x00000400;
    while(Device3==NULL)
    {
        x=x+y;
        cout<<(PVOID*)x<<endl;
        Device3=(struct Device *)MapViewOfFileEx(h_file,
                 FILE_MAP_ALL_ACCESS,
                 0,
             0,
        0,
          (PVOID*)x);
    }
    cout<<(PVOID*)x<<endl;
    cout<<Device3<<endl;
    它的输出结果的最后三行是:
       0x00000000
       0x00000000
       0x00CB0000
    这说明MapViewOfFileEx返回的地址与MapViewOfFileEx的最后一个参数的值不符合。我对MapViewOfFileEx的理解是用MapViewOfFileEx来建立一个内存,它的起始地址是MapViewOfFileEx的最后一个参数的值。难道这样理解有错吗?
    另外,怎么把整个链表结点防到FileMappingObject 里去?
      

  4.   

    你理解的没错,但是我记得在2000下所有的文件file mapping对象都是在从0x00000000到0x7ffffffff的低2G空间内的。你一开始就指定从0x80000000开始可能不行。
       
       要用file mapping来共享一个链表好像比较困难。你在进程A中创建一个链表,那么它们在地址空间中的位置就固定了,如果另一个进程B要共享的话,就要求每一个结点的位置都与A中相同,这就要求你把每个结点都用一个file mapping对象来共享,而且还必须映射在相同的地址。我觉得用数组可能要好些。
      

  5.   

    谢谢webber84(***闭关修炼中***),我知道我上面的代码为什么结果不一致了,把基地址改为0x00000000到0x7ffffffff就可以了。按你这样一说,共享链表确实很困难。我想改用结构体数组,但是只要我的结构体里有指针的话,就老是出错,可是我非得在结构体里用指针。
      

  6.   

    我上面说过了,如果真要用指针就必须把指针指向的东西也享,而且两个进程中必须加载在同一个位置。其实file mapping是很底层的进程间数据共享机制了,像WM_COPYDATA这些都是用它来实现的,越底层当然也就越复杂,当也是没办法的事情 :)
      

  7.   

    谢谢webber84(***闭关修炼中***)和Panr(光荣)及jiangsheng(蒋晟.Net),没有你们我的脑袋不知道还要被雾罩多少天。