CreateFileMapping无法释放 求解

assicen 2010-07-18 11:23:10
CreateSharedMemory创建内存后 使用ReleaseSharedMemory无法释放 求解?
如果在CreateSharedMemory方法中CloseHandle(hFileMapping)就可以成功 为什么?


int CShareMemory::CreateSharedMemory()
{
HANDLE hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
100,
"myMem");

if ((hFileMapping == NULL) || (hFileMapping == INVALID_HANDLE_VALUE))
return -1;
if (GetLastError() == ERROR_ALREADY_EXISTS) return -1;
return 0;
}


int CShareMemory::ReleaseSharedMemory()
{
HANDLE hFileMapping = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, "myMem");
if(hFileMapping) CloseHandle(hFileMapping);
return 0;
}
...全文
385 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
WaistCoat09 2010-07-19
  • 打赏
  • 举报
回复
保存为全局变量里。释放了把句柄赋值为NULL。通过判断句柄是否为NULL来决定操作
fishion 2010-07-19
  • 打赏
  • 举报
回复
不要尝试用OpenFileMapping来打开映射文件的够本来进行CloseHandle,这是没用的,你只能用一个
全局的HANDLE g_hFileMapping;

g_hFileMapping= CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
100,
"myMem");


CloseHandle(g_hFileMapping)
magic7004 2010-07-19
  • 打赏
  • 举报
回复
楼主少调用了一次CloseHandle

建议楼主改成这样:


HANDLE CShareMemory::CreateSharedMemory()
{

HANDLE hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
100,
"myMem");

if ((hFileMapping == NULL) || (hFileMapping == INVALID_HANDLE_VALUE))
return -1;
if (GetLastError() == ERROR_ALREADY_EXISTS) return -1;
return hFileMapping;
}


int CShareMemory::ReleaseSharedMemory(HANDLE hFileMapping)
{
if(hFileMapping) CloseHandle(hFileMapping);
return 0;
}

lazy_2010 2010-07-19
  • 打赏
  • 举报
回复
上面说得对,CreateFileMapping 会创建一个 HANDLE,OpenFileMapping 会打开另外一个 HANDLE,楼主没有关闭两次。

将 HANDLE 加成类成员变量吧。
assicen 2010-07-19
  • 打赏
  • 举报
回复
解决了 其实你们说的都对 我只是没想到 在WriteToSharedMemory方法里使用了OpenFileMapping会影响到关闭
assicen 2010-07-19
  • 打赏
  • 举报
回复
还是不行 共享内存依然还存在 求解!!!!!!!!!!!!!!!!!!!!!


int CShareMemory::CreateSharedMemory()
{
m_hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
100,
"myMem");

if ((hFileMapping == NULL) || (hFileMapping == INVALID_HANDLE_VALUE))
return -1;
if (GetLastError() == ERROR_ALREADY_EXISTS) return -1;
return 0;
}


int CShareMemory::ReleaseSharedMemory()
{
if(m_hFileMapping) CloseHandle(m_hFileMapping);
return 0;
}


stjay 2010-07-18
  • 打赏
  • 举报
回复
你看看两个hFileMapping的值是否一样
一般是同一内核对象的不同引用
OpenFileMapping会创建新的引用

15,471

社区成员

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

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