下午修改个程序,需要在同一个解决方案下的不同的项目下通讯。同事提到了内存映射文件。原来是个挺好的类。
只要访问同一个内存映射文件即可实现通讯。不同的项目都可以访问(据说文件内存中有存储打开次数的标志-Num,每打开一次,增加一,如果为0,自动释放内存)。应用程序终止的时候,映射文件的内存被自动释放。
内存映射文件,顾名思义,是个文件。从最简单的文件操作入手。
HANDLE hMapFile; //映射文件句柄
LPVOID pMapFile;//文件偏移地址
文件的创建:
CreateFileMapping(INVALID_HANDLE_VALUE,NULL, PAGE_READWRITE, 0,sizeof(MyhssUser),Mystrfile);
参数详解:
HANDLE CreateFileMapping(
HANDLE hFile, //物理文件句柄
LPSECURITY_ATTRIBUTES lpAttributes, //安全设置
DWORD flProtect, //保护设置
DWORD dwMaximumSizeHigh, //高位文件大小
DWORD dwMaximumSizeLow, //低位文件大小
LPCTSTR lpName //共享内存名称
);
返回值:HANDLE
写文件:
if( pMapFile != NULL )
{
m_WriteFile = (MyhssUser *)pMapFile;//m_MyWriteFile是自定义的结构体
strcpy(m_WriteFile->m_ID ,"1");
strcpy(m_WriteFile->m_pwd , "1");
}
打开文件:
hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,FALSE,Mystrfile);
参数说明:
dwDesiredAccess Long,带有前缀FILE_MAP_???的一个常数。参考下个解释。
bInheritHandle Long,如这个函数返回的句柄能由当前进程启动的新进程继承,则这个参数为TRUE。
lpName String,指定要打开的文件映射对象名称
MapViewOfFile函数dwDesiredAccess参数的说明
hFileMappingObject Long,文件映射对象的句柄。
dwDesiredAccess Long,下述常数之一:
FILE_MAP_WRITE 映射可读可写。文件映射对象必须通过PAGE_READWRITE访问创建。
FILE_MAP_READ 映射只读。文件映射对象必须通过PAGE_READ 或 PAGE_READWRITE访问创建。
FILE_MAP_ALL_ACCESS 与FILE_MAP_WRITE相同。
FILE_MAP_COPY 映射时保留写操作的副本。文件映射对象必须用PAGE_WRITECOPY访问在win95下创建
dwFileOffsetHigh Long,文件中映射起点的高32位地址。
dwFileOffsetLow Long,文件中映射起点的低32位地址。
dwNumberOfBytesToMap Long,文件中要映射的字节数。用零映射整个文件映射对象。
lpBaseAddress Long,指定映射文件映射对象的地址。如这个地址处没有足够的内存空间,那么对MapViewOfFileEx的调用会失效。零表示允许windows寻找一个地址。
读文件:
pMapFile = MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);//将一个文件映射对象映射到当前应用程序的地址空间
if( pMapFile != NULL )
{
m_ReadFile = (MyhssUser*)pMapFile;
m_ReadFile->m_ID="1";
}
关闭文件:
UnmapViewOfFile(pMapFile);
CloseHandle(hMapFile);