关于内存映射来修改文件,并改变文件的大小

 内存映射是为了方便多个进程间的共同开发从而共享一段内存,但是,它还有一个其他功能,那就是修改文件

在内存映射之前,首先我们需要用 CreatFile()来打开文件,如果我们需要对文件进行修改的话,第二个关键函数必须设置;


hFile=::CreateFile(lpFilename,GENERIC_WRITE|GENERIC_READ ,NULL,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);


接下来就是获取文件大小,if ( INVALID_FILE_SIZE == ( mapp.dwSize=GetFileSize(hFile,NULL)) )  如果相等就是获取错误了。(获取文件大小很关键,下面我会提到)


然后就是经典的CreateFileMapping()来映射文件到内存了, 这个函数共有6个参数,楼主在之前修改文件的时候是读取文件,然后对文件字符串加密,但是加密后的体积比原文件大,这样的话我在写入的时候总是出现问题,后来仔细看了MSDN才发现,猫腻就在这个函数,它的第五个跟第六个函数告诉我们我们要映射文件的高32位的最大值,与低32位的最小值,如果两个都为零的话,它默认映射的大小就是原文件的大小,所以你在试图修改它的映射文件并把它映射回去的时候,会出现比原文件大的情况,这样就出现问题了,所有,我们在映射文件到到内存之前,最好求出我们修改后的文件大小,给CreateFileMapping();



最后就是获取我们映射到内存的基地址了,

ImageBase=::MapViewOfFile(hMapping,FILE_MAP_WRITE,0,0,0);   


还有 ,别忘了关闭句柄,CloseHandle


上例子一个,与君共勉


// 映射文件到内存  输入文件名,返回映射内存的基址
LPVOID LoadFileR(LPTSTR lpFilename, DWORD  dwSize)
{
	HANDLE hFile;
	HANDLE hMapping;
	LPVOID ImageBase;
	hFile=::CreateFile(lpFilename,GENERIC_WRITE|GENERIC_READ ,NULL,NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,0);   // 打开一个文件,获取文件句柄  设置属性为可读可写
	if (NULL == hFile)
	{
		return NULL;
	}


	hMapping=::CreateFileMapping(hFile,NULL,PAGE_READWRITE ,0,dwSize,NULL);      // 映射文件到内存 设置内存为可写

	if (NULL == hMapping)
	{
		int i = GetLastError();
		::CloseHandle(hFile);
		return NULL;
	}
	ImageBase=::MapViewOfFile(hMapping,FILE_MAP_WRITE,0,0,0);   // 获取映射的内存基址
	CloseHandle(hFile);
	CloseHandle(hMapping);

	return ImageBase;

}


Delphi中的内存映射共享数据是一种在不同进程之间共享数据的方法。它允许多个进程访问同一块内存区域,以实现数据的共享和交互。 在Delphi中,可以使用TMemoryMappedFile和TMemoryMappedView来实现内存映射共享数据。首先,使用TMemoryMappedFile创建一个内存映射文件,并指定文件的名称和大小。然后,使用TMemoryMappedView来创建一个内存映射视图,将内存映射文件加载到当前进程的内存中。 一旦内存映射文件被加载到内存中,不同进程可以通过该文件进行数据的读写操作。每个进程可以将数据写入内存映射视图中的指定位置,并通过内存地址进行数据访问。当一个进程修改内存映射视图中的数据后,其他进程也可以看到这些改变。 使用内存映射共享数据的好处是可以提高进程间通信的效率和速度。相比于其他通信方式如管道或消息队列,内存映射共享数据可以直接在内存中读写数据,避免了数据的拷贝和传输,提高了数据的访问速度。 当然,使用内存映射共享数据也需要注意一些问题。由于多个进程可以同时访问和修改数据,需要进行合理的同步和互斥操作,以避免数据的竞争和冲突。此外,对于不同的数据类型和结构,需要正确地定义和解释数据的格式和布局,以确保不同进程之间的数据共享和解析的一致性。 总而言之,Delphi中的内存映射共享数据是一种高效、灵活的进程间通信方式,可以实现数据的共享和交互。通过合理的设计和操作,可以实现进程间数据的高速读写和同步,满足不同应用场景的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值