内存共享 动态数组(300分)

  • 主题发起人 主题发起人 sxflmandy
  • 开始时间 开始时间
S

sxflmandy

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠好:
我想实现两个进程(exe和exe 或exe和dll)之间共享内存,我定义的是一个结构类型,其中结构内型中有动态数组,随着程序的运行会随便setlength,
静态结构我可以实现,但是动态数组有问题,在另一个进程中取不到数据,请给出两边的代码。

结构:例:
type
TBasic = Record
age: Integer;
end;

TInfo = Record
no: Integer;
item: array of TBasic;
end;
 
静态数组就是一指针,其主体不在共享内存中,所以不能用
你必须自己在共享内存中分配一块空间才行
还有,不要在共享内存中直接使用指针,同一块内存在两边的地址不一定是一样的
 
需要使用shareMem单元的,这个问题往上有很多相关文章,不过不好弄啊,对技术要求很高的,呵呵
 
共享内存就不能用动态数组了.可以用静态数组越界访问的方式达到.
type
TBasic = Record
age: Integer;
end;

PInfo = ^TInfo;
TInfo = Record
no: Integer;
item: array[0..0] of TBasic;
end;
CreateFileMapping创建共享内存分配的大一些,转换成PInfo;
例如
a :PInfo;
i : Integer;
就可以
a^.item.age := 100;//注意数组下标不能用1,2,3...用变量是为了越界访问.


VCL类库中很多地方都是这样做的.
 
来了兴趣,给你写段代码.
两个进程,
写入:
var
hMap:THandle;
data:PInfo;
i:integer;
begin
hMap:=CreateFileMapping(INVALID_HANDLE_VALUE,nil,PAGE_READWRITE,0,1024,'_SHARE_MEMORY');
if hMap = 0 then
exit;
data:= Mapviewoffile(hMap,FILE_MAP_READ or FILE_MAP_WRITE,0,0,0);
data^.no := 3;
for I := 0 to data^.no - 1 do
begin
data^.item.age := i;
end;
end;
读取:
var
hMap:THandle;
data:PInfo;
i:integer;
begin
hMap:=CreateFileMapping(INVALID_HANDLE_VALUE,nil,PAGE_READWRITE,0,1024,'_SHARE_MEMORY');
if hMap = 0 then
exit;
data:= Mapviewoffile(hMap,FILE_MAP_READ or FILE_MAP_WRITE,0,0,0);

for I := 0 to data^.no - 1 do
begin
ShowMessage(Format('item[%d].age = %d',[i, data^.item.age]));
end;
end;
 
后退
顶部