不同目录下两个程序A和B,在这两个程序目录下都有mingzi.txt文件(文件名相同,文件内容不同),用内存映像的方法如何实现把A目录下的mingzi.txt文件复制给B目录下的mingzi.txt文件?
我在网上查找了内存映像的方法,但都是对 Edit控件里字串进行传递的!想直接传递.txt文件内容应该写?
下面是对Edit控件里字串进行传递的例子!
private  
hMapFile: THandle;  
MapFilePointer: Pointer;  
public  
{ Public declarations }  
end;  
var  
Form1: TForm1;  
implementation  {$R *.DFM}  procedure TForm1.FormCreate(Sender: TObject);  
begin  
hMapFile := CreateFileMapping (  $FFFFFFFF, // 特殊内存映射句柄  nil, page_ReadWrite, 0,10000,   'DdhDemoMappedFile '); // 文件名  if hMapFile <> 0 then  MapFilePointer := MapViewOfFile (  hMapFile, // 上面映象文件的句柄  File_Map_All_Access,   0, 0, 0) // 访问整个映象文件  
else  
ShowMessage ( 'hMapFile = 0 ');  
if MapFilePointer = nil then  
ShowMessage ( 'MapFilePointer = nil ');  
end;  procedure TForm1.BtnWriteClick(Sender: TObject);  
begin  
StrCopy (PChar (MapFilePointer),  
PChar (EditWrite.Text));//把内容写入共享内存  
end;  procedure TForm1.BtnReadClick(Sender: TObject);  
var  
S: string;  
begin  
S := PChar (MapFilePointer);//从共享内存读出内容  
EditRead.Text := S;  
end; 

解决方案 »

  1.   

    看下这个就明白了
    http://poorboy030103.blog.163.com/blog/static/54635147200711894519129/
    CreateFileMapping第一个参数可以是文件句柄
      

  2.   

    感谢!您的大作我在网上拜读过!您的传送 是用Memo1控件完成的!和我上面用Edit控件传送原理是一样的!
    你的是一个发送程序,一个接收程序!我上面是发送接受写在一起了,复制成两个程序就可以传送接收了!
    StrCopy (PChar (MapFilePointer),PChar (EditWrite.Text));//把内容写入共享内存
    S := PChar (MapFilePointer);//从共享内存读出内容   
    EditRead.Text := S;   
    我的问题是?如何把A程序目录下一个txt文件映像, B程序接收txt文件内容并保存到B的当前目录下?语句怎么写?
    StrCopy(PChar(MapFilePointer),PChar('shiwu.txt'));//把内容写入共享内存
    是这样写吗????????????????????????
      

  3.   

    呵呵,这个大作不是我的
    CreateFileMapping可以接收一个文件句柄,也就是fileopen打开的文件,a程序负责向文件里写入,之后你在b程序里读取就可以了,可以另声明一个filewriter把读取的内容写到B程序接收的txt文件内
      

  4.   

    1.创建或打开一个磁盘文件,调用FileCreate()或FileOpen()函数,它们的声明如下:
    function FileCreate(const FileName:String):Integer; //创建由FileName指定文件名的文件,并返回文件句柄。
    function FileOpen(const FileName:String;Mode:Word):Integer; //以Mode指定的文件访问模式打开由FileName指定文件名的文件,并返回文件句柄。
    FileOpen()的Mode参数值如下:
    fmOpenRead   只读模式
    fmOpenWrite   只写模式
    fmOpenReadWrite   可读写模式function CreateFileMapping(hFile:THandle; //要映射到内存中的文件的文件句柄,就是调用FileCreate()或FileOpen()函数
      

  5.   

    当 Win95与 Winows Nt向内存中装载文件时,使用了特殊的全局内存区。在该区域内,应用程序的虚拟内存地址和文件中的相应位置一一对应。由于所有进程共享了一个用于存储映象文件的全局内存区域,因而当两个进程装载相同模块(应用程序或 DLL文件)时,它们实际可以在内存中共享其执行代码。笔者通过调用一个带有特殊参数的 CreateFileMapping函数,来间接达到程序间共享内存的目的。下面简要解释一下该函数。HANDLE CreateFileMapping(HANDLE hFile, //文件句柄  LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // 可选安全属性DWORD flProtect, // 映象文件保护方式  DWORD dwMaximumSizeHigh, // 映象文件区域的底值  DWORD dwMaximumSizeLow, // 映象文件区域的顶值  LPCTSTR lpName // 映象文件的名字);  如果 hFile是 0xFFFFFFFF,在调用程序中必须指定 dwMaximumSizeHigh 和 dwMaximumSizeLow参数的值以确定映象文件的大小。通过这样的参数指定,该函数就创建了一个由操作系统页文件支持的特殊逻辑映象文件,而不是由实际操作系统的文件支持的逻辑映象文件。这个逻辑映象文件可以通过复制、继承或者按名字来达到共享。至于其它参数的详细说明,请参看在线帮助。在建立了映象文件之后,我们可以通过调用另外一个 API函数 MapViewOfFile来访问它的内存,该函数会返回一个指向共享内存块的特定指针。LPVOID MapViewOfFile(HANDLE hFileMappingObject, // 映象文件句柄  DWORD dwDesiredAccess, // 访问方式  DWORD dwFileOffsetHigh, // 映象文件区域的底值  DWORD dwFileOffsetLow, // 映象文件区域的顶值DWORD dwNumberOfBytesToMap // 映射字节数);如果 dwNumberOfBytesToMap 是 0,映射整个文件。以下举例说明:privatehMapFile: THandle;MapFilePointer: Pointer;public{ Public declarations }end;varForm1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);beginhMapFile := CreateFileMapping ($FFFFFFFF, // 特殊内存映射句柄nil, page_ReadWrite, 0,10000,  'DdhDemoMappedFile'); // 文件名if hMapFile <> 0 thenMapFilePointer := MapViewOfFile (hMapFile, // 上面映象文件的句柄File_Map_All_Access,  0, 0, 0) // 访问整个映象文件elseShowMessage ('hMapFile = 0');if MapFilePointer = nil thenShowMessage ('MapFilePointer = nil');end; procedure TForm1.BtnWriteClick(Sender: TObject);beginStrCopy (PChar (MapFilePointer),PChar (EditWrite.Text));//把内容写入共享内存end; procedure TForm1.BtnReadClick(Sender: TObject);varS: string;beginS := PChar (MapFilePointer);//从共享内存读出内容EditRead.Text := S;end;用这种方法,不但可以在不同的程序之间共享数据,还可以在同一程序的不同实例间共享数据。
      

  6.   

    哥们您和我的是一个地方出的!哈哈!
    我的问题是怎么把
    StrCopy (PChar (MapFilePointer),PChar (EditWrite.Text));//把内容写入共享内存
    S := PChar (MapFilePointer);//从共享内存读出内容   
    EditRead.Text := S; 
    替换成  
    如何把A程序目录下一个txt文件映像, B程序接收txt文件内容并保存到B的当前目录下?语句怎么写?
    StrCopy(PChar(MapFilePointer),PChar('shiwu.txt'));//把内容写入共享内存
    是这样写吗????????????????????????
      

  7.   

    LZ仔细看我3,4L的回复了么?内存映射是把文件的io操作变成内存读写,a程序的a.txt本身作为内存映射的句柄CreateFileMapping 之后所有对内存的操作就是直接对文件的操作,内存映射释放后会更新a.txt,你需要自己写个filestream把从a读出的内容写到b.txt里,不管是memo,edit,文件还是神马控件,内存映射和b.txt一毛钱关系也没有,那是你自己的处理逻辑