win7下使用共享内存方式CreateFileMapping返回GetLastError总是0x5的问题解决
2015-07-29 14:53
218 查看
在普通应用程序中使用共享内存方式创建内存共享对象时,CreateFileMapping函数总是返回句柄为NULL,通过GetLastError得到返回错误码 0x5, 问题解决:
使用Local 代替Global, 问题解决,下面是使用实例:
TCHAR szName[] = TEXT("Local\\MyFileMappingObject");
TCHAR szName[] = TEXT("Global\\MyFileMappingObject");
原来 Global\\ 保证创建的对象是全局的,对权限要求比较高,而使用local可以保证服务对象仅对当前用户中的进程和线程可见。这就是总是返回权限失败问题的原因。
附一个使用实例:
// testsharemem.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#define BUF_SIZE 256
TCHAR szName[] = TEXT("Local\\MyFileMappingObject");
TCHAR szMsg[] = TEXT("Message from first process.");
int p1();
int p2();
int _tmain(int argc, _TCHAR* argv[])
{
if (argc == 1)
{
p1();
}
else
{
p2();
}
return 0;
}
int p1()
{
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
BUF_SIZE, // maximum object size (low-order DWORD)
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("P1: Could not create file mapping object (%d).\n"),
GetLastError());
return 1;
}
else
{
_tprintf(TEXT("P1: create file mapping object hMapFile= (0x%x).\n", hMapFile));
}
pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
_tprintf(TEXT("P1: Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
_getch();
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
int p2()
{
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("P2: Could not open file mapping object (%d).\n"),
GetLastError());
return 1;
}
pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
_tprintf(TEXT("P2: Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
使用Local 代替Global, 问题解决,下面是使用实例:
TCHAR szName[] = TEXT("Local\\MyFileMappingObject");
TCHAR szName[] = TEXT("Global\\MyFileMappingObject");
原来 Global\\ 保证创建的对象是全局的,对权限要求比较高,而使用local可以保证服务对象仅对当前用户中的进程和线程可见。这就是总是返回权限失败问题的原因。
附一个使用实例:
// testsharemem.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <Windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#define BUF_SIZE 256
TCHAR szName[] = TEXT("Local\\MyFileMappingObject");
TCHAR szMsg[] = TEXT("Message from first process.");
int p1();
int p2();
int _tmain(int argc, _TCHAR* argv[])
{
if (argc == 1)
{
p1();
}
else
{
p2();
}
return 0;
}
int p1()
{
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
BUF_SIZE, // maximum object size (low-order DWORD)
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("P1: Could not create file mapping object (%d).\n"),
GetLastError());
return 1;
}
else
{
_tprintf(TEXT("P1: create file mapping object hMapFile= (0x%x).\n", hMapFile));
}
pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
_tprintf(TEXT("P1: Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
_getch();
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
int p2()
{
HANDLE hMapFile;
LPCTSTR pBuf;
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("P2: Could not open file mapping object (%d).\n"),
GetLastError());
return 1;
}
pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
_tprintf(TEXT("P2: Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
return 0;
}
相关文章推荐
- 基于Unity5.0系统的新打包方式
- Android实例-退出程序(XE8+小米2)
- Android新闻类界面分享(多种布局的listview)
- android 判断当前应用是否与服务器连接成功
- Android应用性能调试
- cordova 打包的项目里加入微信支付功能编译问题。
- Android官方命令深入分析之Device Monitor
- Android PopupWindow 与 软键盘 的遮挡问题解决
- 封装好的popupwiindow功能类分享到微信好友、朋友圈、qq好友、qq空间
- Android官方命令深入分析之Device Monitor
- objectARX错误处理函数
- iOS开发多线程篇—GCD的基本使用
- 【IOS】IOS开发常用函数
- Windows 7 android真机调试设置
- DoTween(HOTween V2) 教程
- iOS开发多线程篇—GCD介绍
- iOS中使用轮播图遇到的问题
- iOS开发之使用Runtime给Model类赋值
- IOS资料
- 冒泡排序小程序