对境像共享内存了解的进来。

边缘998 2010-08-17 01:31:39
TDataRec=Packed Record
Name:array[0..200] of Char;
Data:Pointer;
end;
PDataRec=^TDataRec;

PDatas=Array of PDataRec;

有一个结构体数组,我想将其共享出来,不知道怎么分配内存。

比如:
var
Datas:PDatas;//声明一个指针数组变量。


//将其设置为2个结构大小的镜像文件。
LSize := Sizeof(TDataRec);
MapThandle := CreateFileMapping(DWORD($FFFFFFFF),nil, PAGE_READWRITE,0,
LSize*2,MUTIMAPNAME);


//下面这句出错了。
Datas := MapViewOfFile(MapThandle, FILE_MAP_ALL_ACCESS, 0, 0, LSize);

这里的倒数第三个和第二个偏移要如何设定,再有MapViewOfFile返回的指针,如何赋值给结构体指针,还有LSIZE大小是否对了,试了几个都不成功,忘高手指点。




...全文
95 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
边缘998 2010-08-30
  • 打赏
  • 举报
回复
嗯。后面我也搞出来了。
iamduo 2010-08-17
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_40ac71670100kk7k.html

请勿直接使用代码。
领会精神即可。
边缘998 2010-08-17
  • 打赏
  • 举报
回复
不是吧,高手都不在?躲着了?
zhaodog 2010-08-17
  • 打赏
  • 举报
回复
1、 Datas := MapViewOfFile(MapThandle, FILE_MAP_ALL_ACCESS, 0, 0, LSize);
这里的size应该写你分配的大小或者0
2、如果你要分配的是TDataRec数组的话,
TDataRecArray= Array[0..1024] of TDataRec;
PDatas=^TDataRecArray;
例子

var
LSize:Integer;
MapThandle:HWND;
Datas:PDatas;
begin
LSize := Sizeof(TDataRec);
MapThandle := CreateFileMapping(DWORD($FFFFFFFF),nil, PAGE_READWRITE,0,
LSize*2,'');


Datas := MapViewOfFile(MapThandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
Datas[0].Name:='a';
Datas[1].Name:='b';
end;

CaesarDM 2010-08-17
  • 打赏
  • 举报
回复
使用内存Map共享数据

首先,要求内存数据连续(概念意义上)
你这里的的
TDataRec=Packed Record
Name:array[0..200] of Char;
Data:Pointer;
end;
PDataRec=^TDataRec;

PDatas=Array of PDataRec;
是危险的

Data所指向的内存地址,在另一程序中无法访问。

动态array其实是个指针,而不是内存实体,所以你这里的PDatas=Array of PDataRec;相关于PDatas=^ Array[0..n] of PDataRec。而且后面的实体,你又是个指针,那我都啥了。。。



整顿步骤:
1.先将Data实体化,变为指定长度的参数类型,而且非指针
2.将内存连续化,改造
Datas=Array[0..0] of TDataRec;
PDatas=^Datas;
这里要注意,并不是数组真的只有一个,而是用来占位,以后的数据就是连续的
3.数据量不大的话,MapViewOfFile后三个参数全0,解释请看MSDN

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧