Win2000的共享内存是同机进程间通信的一个省事的办法。虽然只能在同一台机器上起作用,但使用起来很方便。现在下面开始介绍一下函数:
1. CreateFileMapping
HANDLE CreateFileMapping(
HANDLE hFile, // handle to file
LPSECURITY_ATTRIBUTES lpAttributes, // security
DWORD flProtect, // protection
DWORD dwMaximumSizeHigh, // high-order DWORD of size
DWORD dwMaximumSizeLow, // low-order DWORD of size
LPCTSTR lpName // object name
);
第一个参数是一个File的句柄,具体见下面所示。
第二个参数就是NULL了,具体怎么用,不清楚。
第三个参数是权限。
第四个和第五个参数是最大最小容量。
第六个参数是内存名称,这在系统中是唯一的
2. OpenFileMapping
HANDLE OpenFileMapping(
DWORD dwDesiredAccess, // access mode
BOOL bInheritHandle, // inherit flag
LPCTSTR lpName // object name
);
3. MapViewOfFile
LPVOID MapViewOfFile(
HANDLE hFileMappingObject, // handle to file-mapping object
DWORD dwDesiredAccess, // access mode
DWORD dwFileOffsetHigh, // high-order DWORD of offset
DWORD dwFileOffsetLow, // low-order DWORD of offset
SIZE_T dwNumberOfBytesToMap // number of bytes to map
);
DWORD dwFileOffsetHigh, // high-order DWORD of offset
DWORD dwFileOffsetLow, // low-order DWORD of offset
这两个参数就是指打开文件的OFFSET,因为一般文件不会大于
然后就可以用指针对共享内存进行操作了。
4. MapViewOfFileEx
LPVOID MapViewOfFileEx(
HANDLE hFileMappingObject, // handle to file-mapping object
DWORD dwDesiredAccess, // access mode
DWORD dwFileOffsetHigh, // high-order DWORD of offset
DWORD dwFileOffsetLow, // low-order DWORD of offset
SIZE_T dwNumberOfBytesToMap, // number of bytes to map
LPVOID lpBaseAddress // starting address
);
这个函数和上面的函数最本质的区别在于LPVOID lpBaseAddress,这个参数是问题的关键,这个地方能预先指定一个开始的地址,没有用过,不过比较有意思
5. FlushViewOfFile
BOOL FlushViewOfFile(
LPCVOID lpBaseAddress, // starting address
SIZE_T dwNumberOfBytesToFlush // number of bytes in range
);
顾名思义,把文件往硬盘上写。那些无名文件,当然不可以了。
6. UnmapViewOfFile
BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress // starting address
);
关闭内存共享文件。如果还有文件句柄,需要另外关闭。
又及:如果文件句柄如果不使用INVALID_HANDLE_VALUE,则需要创建或者打开一个句柄,通常的办法有:
1. CreateFileForMapping
HANDLE CreateFileMapping(
HANDLE hFile, // handle to file
LPSECURITY_ATTRIBUTES lpAttributes, // security
DWORD flProtect, // protection
DWORD dwMaximumSizeHigh, // high-order DWORD of size
DWORD dwMaximumSizeLow, // low-order DWORD of size
LPCTSTR lpName // object name
);
2. CreateFile
HANDLE CreateFile(
LPCTSTR lpFileName, // file name
DWORD dwDesiredAccess, // access mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD
DWORD dwCreationDisposition, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to template file
);