blog

枪手亨利

博客园 首页 新随笔 联系 订阅 管理

 

                                      

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,因为一般文件不会大于4G,所以一般高位这个都被忽略掉了。

然后就可以用指针对共享内存进行操作了。

 

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
);
posted on 2005-11-08 14:19  henry  阅读(2428)  评论(0编辑  收藏  举报