各位高手:MapViewOfFileEX的最后一个参数到底怎么用? 我想在多个进程之间共享一个结构体链表,想用MapViewOfFileEX来确定链表的头结点,从而共享整个链表。这里怎么用MapViewOfFileEX的最后一个参数? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 《WINDOWS核心编程》一书的第17章即429页。我总不理解怎么用MapViewOfFileEX来共享链表。退后一步,我不用链表,而用内存映射文件来共享一个连续的可变长的结构体数组(结构体中包含字符数组,联合体,和指向另一结构体的指针),我又能做到吗? 你得把整个链表结点防到FileMappingObject 里去才行如果MapViewOfFileEx 调用成功,那么它返回的值就是lpBaseAddress(重复参数是为了兼容MapViewOfFile),估计这样该你能明白了吧对lpBaseAddress 的前提性要求是它必须是系统存储管理中页面大小(4K byte)的整数倍。如果lpBaseAddress 不是整数倍,函数一定会失败 我还不明白,请看下面一段简单的代码: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 里去? 你理解的没错,但是我记得在2000下所有的文件file mapping对象都是在从0x00000000到0x7ffffffff的低2G空间内的。你一开始就指定从0x80000000开始可能不行。 要用file mapping来共享一个链表好像比较困难。你在进程A中创建一个链表,那么它们在地址空间中的位置就固定了,如果另一个进程B要共享的话,就要求每一个结点的位置都与A中相同,这就要求你把每个结点都用一个file mapping对象来共享,而且还必须映射在相同的地址。我觉得用数组可能要好些。 谢谢webber84(***闭关修炼中***),我知道我上面的代码为什么结果不一致了,把基地址改为0x00000000到0x7ffffffff就可以了。按你这样一说,共享链表确实很困难。我想改用结构体数组,但是只要我的结构体里有指针的话,就老是出错,可是我非得在结构体里用指针。 我上面说过了,如果真要用指针就必须把指针指向的东西也享,而且两个进程中必须加载在同一个位置。其实file mapping是很底层的进程间数据共享机制了,像WM_COPYDATA这些都是用它来实现的,越底层当然也就越复杂,当也是没办法的事情 :) 谢谢webber84(***闭关修炼中***)和Panr(光荣)及jiangsheng(蒋晟.Net),没有你们我的脑袋不知道还要被雾罩多少天。 Visual assist 10.6.1845 PE文件特征码如何提取 第一次用VC做数据库,有点问题请大家指教 这么优美的代码居然会有错(socket) 为什么afxData在编译的时候总是提示没有这个东西呢? 急!!我用mfc写的ActiveX程序生成一个xml文件,怎样才能把这个xml文件发送到jsp网页呢? 如何将一个wstring类型的串输出到文件中 VC疑问之一 重载new的问题 关闭程序的问题 请问vc.net的link选项卡在哪里 如何在ATL Service程式中同时连接两个数据库?
对lpBaseAddress 的前提性要求是它必须是系统存储管理中页面大小(4K byte)的整数倍。如果lpBaseAddress 不是整数倍,函数一定会失败
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 里去?
要用file mapping来共享一个链表好像比较困难。你在进程A中创建一个链表,那么它们在地址空间中的位置就固定了,如果另一个进程B要共享的话,就要求每一个结点的位置都与A中相同,这就要求你把每个结点都用一个file mapping对象来共享,而且还必须映射在相同的地址。我觉得用数组可能要好些。