内存操作(150分)

  • 主题发起人 唐晓锋
  • 开始时间

唐晓锋

Unregistered / Unconfirmed
GUEST, unregistred user!
我在BC++中开辟了一个buf来储存字符串,如何在delphi中访问这个
buf 读出其中的内容呢?
 
用存储映象文件行吗?我没用过,但我这书上有个例子,上面写:
“通过建立命名的存储映象文件,我们可允许其他程序共享该内存区......”
程序用的是纯粹的API,应该BC中也能用。
书是《Delphi高级开发指南》,311-312页,要的话我可以敲上来。
 
谢谢茶叶蛋,这本书我有:)
我有点不清楚,想找个具体的应用!
 
用过了。
具体内容是这样的:
先用CreateFileMapping这个函数建立一个内存文件,然后用MapViewOfFile
来获得对这个内存文件操作的句柄,接着就可以开始干了。
比方说:
您的BC程序里头是:
hMapfile = CreateFileMapping( $ffffffff, NULL, Page_ReadWrite, 0, 255, "StringFile" );
if ( hMapfile != 0 ) MapFilePointer = MapViewOfFile( hMapFile, File_Map_All_Access, 0, 0, 0 );
然后用 StrCopy之类的函数把字符串考到该内存文件里头就可以用别的程序进行读写了。
在Delphi程序里头,用
hMapfile := CreateFileMapping( $ffffffff, nil, Page_ReadWrite, 0, 255, 'StringFile' );
if ( hMapfile != 0 ) MapFilePointer := MapViewOfFile( hMapFile, File_Map_All_Access, 0, 0, 0 )
else
showmessage( 'hmapfile=0' );
if mapfilepointer = nil then
showmessage( 'mapfilePointer = nil' );
获得对该内存文件的存取权限,
用 StrCopy( PChar( mapfilepoiner ), PChar( yourselfstring ) );
写,
用 StrCopy( PChar( yourselfstring ) , PChar(ss ) );
yourselfstring := ss;
读,那本书上的例子很好,我手头没有C++,以上所有C源码全是翻译过来的。
用Delphi作的例子能用。参数什么的大可不用改,都用它的例子里头的就行了。
 
不知你是要在进程内通讯,还是要在进程间通讯?
如果你要在两个不同进程间交换数据,可以用茶叶蛋所提供的方法,当然,C中
CreateFileMapping的第一个参数为0xFFFFFFF,不是$FFFFFFFF. 还有一种方法
是使用DLL,在DLL中分配共享数据段。
如果你是在同一进程内同时使用BC和Delphi,由于Pascal中字符串同C中不同,Pascal 的字符串可被C直接使用,而C中字符串不能被Pascal使用。解决方案有
两种:1.由于Delphi在String中地址负偏移量位置加上字符串长度,可在
BC中先多分配1个字节,如:
char *p=(char *)malloc(size+1);
*(long *)p=strlen(str);
strcpy(p+1,str);
然后将p+1传给Delphi就可。当然这时字符串长度不能超过256。
如果字符串长度超过256,就要使用AnsiString,这时,数据格式我也记不住,可
查一下有关书籍或查看一下AnsiString在内存中格式。
2。直接把BC传来字符串当成字符数组就可:
var
s:string;
i:integer;

begin
s:='';
i:=0;
while p<>0do
begin
s:=s+p;
inc(i);
end
 
用Windows的DDE可进行数据的交换。
 
你可以作个vxd,自己定义一条服务n(传递地址)
到时用DeviceIOControl(vxdhandle,n,inputbuf,inputlen,outputbuf,outputlen,nil,nil,nil);
这样做的速度还快,尤其在大数据量时
这样的vxd在Vtoolsd中已经详细的例子,我这里有一个卫星网卡的驱动(毕设)
里边就使用了共享的内存,需要的话我把它上载
 
to bgi:
是delphi的程序吗?如果是vc的,关键部分如果用的api就发给我吧
 
是VC的程序,但是用的是vtoolsd提供的api
并且,vxd运行在ring0上,windows的api应该失去作用乐吧(除去vmm外)
另vtoolsd就是numega公司产的,它应该有自己的内存api吧
 
bgi: 您好像给我发过您的程序,但我的硬盘前几天报销了,您
能在给我发一份吗?
谢谢!
 
唐晓锋:我现在只能在实验室上网,我个人的机器没有软驱,我去给你找一下
吧,不过我要毕业了,现在事情比较多,可能时间上会晚一点(三天之内吧)。
 
能给我一份吗?
 
晓茶:
挺想你的! :)
最近好吗?
 
多人接受答案了。
 
顶部