文件映射实现进程通信
需要用到两个重要的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;
}