Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)aaa
published in(发表于) 2014/7/19 0:09:44
delphi内存映像的步骤

delphi内存映像的步骤

内存映像的步骤

在Win32 上的所有共享内存都依赖于Win32 的内存映像文件I/O 的支持。一个内存映像文件使用共享内存来提供公共的基于文件的共享数据。

内存映像文件I/O 是Win32 API 处理磁盘文件的一种方式。如果对虚拟内存不控制数据缓冲和内存缓冲,则当一个文件被映像到内存区时,从映像内存读写数据和从文件中读写数据会产生同样的效果。内存映像文件I/O 效率很高,且使用非常方便。内存映像文件I/O 允许两个或多个进程共享基于文件的数据。每个和共享有关的进程直接存取一组公共页。由于共享导致可用资源最很小,所以当大量的数据必须被共享时,通过内存映像文件I/O 共享就显得非常有用。

内存映像文件的支持需要3 个Windows 内核对象:文件、文件映像和视图。为了映像一个文件到内存,首先从磁盘打开一个文件,再建立映像文件,然后将映像文件连接到内存。为了在不同进程间使数据同步,它提供了一个基于磁盘文件的逻辑连接,最终通过一个数据地址指针来实现对数据块的访问。一个内存映像文件对象可以创建多个视图,它们可以分别存取文件的不同部分。

使用内存映像文件I/O 需遵循以下步骤。

1.打开磁盘文件

打开磁盘文件可采用CreateFile 或OpenFile 等函数。打开一个基于磁盘的文件,一般采用OpenFile()

函数,其原型如下:

function OpenFile(const lpFileName:LPCSTR;var lpReOpenBuff:TOFStruct;uStyle:UINT

):HFILE;stdcall;

POFStruct=^TOFStruct;

TOFSTRUCT=record

cBytes:Byte;

fFixedDisk:Byte;

nErrCode:Word;

Reserved1:Word;

Reserved2:Word;

szPathName:array[0..OFS_MAXPATHNAME-1] of CHAR;

end;

注意:OpenFile 的返回值为-1 时,表示打开文件失败。参数uStyle 定义了打开文件标示(OF_READ、OF_WRITE、OF_READWRITE 等)、文件被其他进程共享的文件方式(OF_SHARE_EXCLUTIVE、OF_SHARE_DENY_WRITE 等),以及文件打开时采取的动作(OF_CREATE、OF_DELETE、OF_EXIST 等)。在不再使用该文件时,记得调用函数CloseHandle。

2.创建文件映像对象

通过函数CreateFileMapping 创建文件映像对象,才能使用内存映像文件。CreateFileMapping 函数的第1 个参数使用上一步得到文件句柄,当然,也可以设置为$FFFFFFFF,这时文件映像对象是基于内存的,而不是基于文件的。lpszMapName 参数是给文件映像对象起的名字,必须确保其惟一性,因为与一个未知进程的名字冲突会产生非希望的共享。

除了CreateFileMapping 函数之外,还有两个函数可以操作文件映像对象,分别是OpenFileMapping和DuplicateHandle。

3.创建视图对象

创建视图对象需要调用MapViewOfFile()函数。

注意:可以在一个文件中创建多个视图,以便分别访问文件的不同部分。调用MapViewOfFile函数时需要传递视图在文件的起始位置偏移和要映射的字节数。




If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759