文件映射实现进程通信

需要用到两个重要的API

HANDLE
WINAPI
CreateFileMappingW(
__in HANDLE hFile, //文件句柄
__in_opt LPSECURITY_ATTRIBUTES lpFileMappingAttributes, //安全设置
__in DWORD flProtect, //保护设置
__in DWORD dwMaximumSizeHigh, //高位文件大小
__in DWORD dwMaximumSizeLow, //低位文件大小
__in_opt LPCWSTR lpName //共享内存名称
);

1.HANDLE hFile
指定欲在其中创建映射的一个文件句柄。0xFFFFFFFF(-1,即INVALID_HANDLE_VALUE)
表示在页面文件中创建一个可共享的文件映射。
2.LPSECURITY_ATTRIBUTES lpFileMappingAttributes
2.1 SECURITY_ATTRIBUTES :它指明返回的句柄是否可以被子进程所继承,指定一个安全对象,在创建文件映射时使用。
2.2 NULL :(用ByVal As Long传递零),表示使用默认安全对象。
3.DWORD flProtect
3.1 PAGE_READONLY 以只读方式打开映射
3.2 PAGE_READWRITE 以可读、可写方式打开映射
3.3 PAGE_WRITECOPY 为写操作留下备份
4.DWORD dwMaximumSizeHigh
文件映射的最大长度的高32位
5.DWORD dwMaximumSizeLow
文件映射的最大长度的低32位。
如这个参数和dwMaximumSizeHigh都是零,就用磁盘文件的实际长度。
6.LPCWSTR lpName
指定文件映射对象的名字。如存在这个名字的一个映射,函数就会打开它。
用vbNullString可以创建一个无名的文件映射。

LPVOID
WINAPI
MapViewOfFile(
__in HANDLE hFileMappingObject,
__in DWORD dwDesiredAccess,
__in DWORD dwFileOffsetHigh,
__in DWORD dwFileOffsetLow,
__in SIZE_T dwNumberOfBytesToMap
);

MapViewOfFile 功能是将一个文件映射对象映射到当前应用程序的地址空间。

1.HANDLE hFileMappingObject
为CreateFileMapping()返回的文件映像对象句柄
2.DWORD dwDesiredAccess
映射对象的文件数据的访问方式,而且同样要与CreateFileMapping()函数所设置的保护属性相匹配。 可取以下值:
2.1 FILE_MAP_ALL_ACCESS 等价于CreateFileMapping的 FILE_MAP_WRITE|FILE_MAP_READ. 文件映射对象被创建时必须指定PAGE_READWRITE 选项.
2.2 FILE_MAP_COPY 可以读取和写入文件.写入操作会导致系统为该页面创建一份副本.在调用CreateFileMapping时必须传入PAGE_WRITECOPY保护属性.
2.3 FILE_MAP_EXECUTE 可以将文件中的数据作为代码来执行.在调用CreateFileMapping时可以传入PAGE_EXECUTE_READWRITE或PAGE_EXECUTE_READ保护属性.
2.4 FILE_MAP_READ 可以读取文件.在调用CreateFileMapping时可以传入PAGE_READONLY或PAGE_READWRITE保护属性.
2.5 FILE_MAP_WRITE 可以读取和写入文件.在调用CreateFileMapping时必须传入PAGE_READWRITE保护属性.
3.DWORD dwFileOffsetHigh
表示文件映射起始偏移的高32位
4.DWORD dwFileOffsetLow
表示文件映射起始偏移的低32位
5.SIZE_T dwNumberOfBytesToMap
指定映射文件的字节数

在这里插入代码片
HANDLE OpenFileMappingHandle(CString MapName)
{
	HANDLE hMapping; 
	hMapping=CreateFileMapping((HANDLE)0xFFFFFFFFFFFFFFFF,NULL,PAGE_READWRITE,0,DATA_LENGTH,MapName);
	if(hMapping==NULL) 
	{ 		
		return NULL;
	}
	
	return hMapping; 
}

bool CloseFileMappingHandle(HANDLE hMapping)
{
	return (CloseHandle(hMapping));
}

bool FileMapRead(HANDLE hMapping,CString * pstrData)
{
	wchar_t * lpData; 
	//将文件的视图映射到一个进程的地址空间上,返回LPVOID类型的内存指针
	lpData=(wchar_t *)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0); 
	if(lpData==NULL) 
	{	
		return FALSE;
	}
	//给这段映像内存的数据赋给本地变量
	pstrData->Format(_T("%s"),lpData);
	
	//sprintf(lpData,_T("0"));
	if(*pstrData != _T(""))
		memset(lpData,0,DATA_LENGTH);

	UnmapViewOfFile(lpData);//释放映像内存
	return TRUE;
}

bool FileMapWrite(HANDLE hMapping,CString strData)
{
	wchar_t * lpData;  
	//将文件的视图映射到一个进程的地址空间上,返回LPVOID类型的内存指针
	lpData=(wchar_t *)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);   
	if(lpData==NULL)   
	{   
		return FALSE;
	}
//	_stprintf(lpData,strData.GetBuffer());   //给这段映像内存写数据
//	_swprintf_s(lpData,strData);
	memcpy(lpData,strData.GetBuffer(),strData.GetLength()*2);
	UnmapViewOfFile(lpData);   //释放映像内存

	return TRUE;
}

DATA_LENGTH为指定的需要的空间,由于是在unicode的字符集下,所以有用到wchar_t。如果是多字符集用char就好了

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐