下午修改个程序,需要在同一个解决方案下的不同的项目下通讯。同事提到了内存映射文件。原来是个挺好的类。
只要访问同一个内存映射文件即可实现通讯。不同的项目都可以访问(据说文件内存中有存储打开次数的标志-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);