重金请教MapViewOfFile失败的原因

王云飞 2005-12-22 11:15:25
小弟在使用内存映射技术进行进程间通信,进程A在每次发送数据的时候均执行如下过程,
映射已经使用CreateFileMapping创建好的内存映射文件到本进程的地址空间,
如果成功,则使用此地址,写入数据;如果不成功,则关闭内存映射文件的句柄,重新
创建之,并再次映射。

此段逻辑代码在某些机器上长时间运行无误,在有些机器上则会运行若干小时后发生映射
失败的情况,并在内存映射文件重新创建后,仍旧失败。

百思不得其解,请指教

运行环境:Windows 2K NTFS文件系统

buf_s_pri_p = MapViewOfFile(buf_s_pri, FILE_MAP_WRITE, 0, 0, 0);
if(buf_s_pri_p == NULL)
{
CloseHandle(buf_s_pri);

buf_s_pri = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, getSBufSize() * 1024, getSBufName());

if(buf_s_pri == NULL)
return false;

buf_s_pri_p = (Private_Buf*)MapViewOfFile(buf_s_pri, FILE_MAP_WRITE, 0, 0, 0);
if(buf_s_pri_p == NULL)
return false;
}
...全文
907 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
singlerace 2006-01-05
  • 打赏
  • 举报
回复
在CreateFileMapping失败后看看该线程是不是被Impersonate成别的user或者level了。
alextooter 2006-01-04
  • 打赏
  • 举报
回复
参考inside visual c++ 的第三十五章,有关memory mapping的段落,每次create之后就复制一份,关闭原来的。在进程b中打开使用之后关闭,我以前也遇到过这个问题。网络上有电子书的。
willwl 2005-12-26
  • 打赏
  • 举报
回复
不好意思哈,我刚知道0是全部拷过来,晕死了
willwl 2005-12-26
  • 打赏
  • 举报
回复
还有就是这个大小一般是64*sysInfo.dwAllocationGranularity,再具体可以查下msdn
willwl 2005-12-26
  • 打赏
  • 举报
回复
楼主的MapViewOfFile的最后一个参数为杀是0啊,偶写的代码两函数映射空间的大小一样dwBufferSize=4096

m_hExchangeFile = CreateFileMapping((HANDLE)0xFFFFFFFF,
0,
PAGE_READWRITE,
0,
dwBufferSize,
"Map");

/*
HANDLE CreateFileMapping(
HANDLE hFile, //物理文件句柄
LPSECURITY_ATTRIBUTES lpAttributes, //安全设置
DWORD flProtect, //保护设置
DWORD dwMaximumSizeHigh, //高位文件大小
DWORD dwMaximumSizeLow, //低位文件大小
LPCTSTR lpName //共享内存名称
);
*/

//把文件数据映射到进程的地址空间
m_lpCodeBuffer = MapViewOfFile(
m_hExchangeFile,
FILE_MAP_ALL_ACCESS,
0,
0,
dwBufferSize);

/*
LPVOID MapViewOfFile(HANDLE hFileMappingObject, //文件映像对象句柄
DWORD dwDesiredAccess, //保护设置
DWORD dwFileOffsetHigh, //数据文件的高位偏移地址
DWORD dwFileOffsetLow, //数据文件的低位偏移地址
DWORD dwNumberOfBytesToMap); //数据文件的映射长度
*/

if (m_lpCodeBuffer == NULL)
{
CloseHandle(m_hExchangeFile);
return FALSE;
}
mythay 2005-12-26
  • 打赏
  • 举报
回复
是否CloseHandle(buf_s_pri)前少释放了一些资源?比如已经提交的内存页或者其他东东
王云飞 2005-12-22
  • 打赏
  • 举报
回复
嗯 正在等待新的错误出现~~~,然后查看GetLastError
goodboyws 2005-12-22
  • 打赏
  • 举报
回复
MapViewOfFile失败就重新创建不够合理,应该判断错误原因
王云飞 2005-12-22
  • 打赏
  • 举报
回复
奥 还有 我的程序以系统服务方式运行,并用SetNamedSecurityInfo设置了安全级别为内核对象,否则不能在服务程序间共享访问

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧