我用WinAPI的MapViewOfFile函数遇到了这种情况。 互联网搜索没有发现任何明显的修复,所以我将在这里分享我的问题和解决方案。

请考虑以下代码段:

const char *name = "Global\\Object_Name";
unsigned long size = get_object_size();

HANDLE handle = CreateFileMapping(INVALID_HANDLE_VALUE,
                                  NULL,
                                  PAGE_READWRITE,
                                  0,
                                  size,
                                  name);

if (!handle || handle == INVALID_HANDLE_VALUE)
    exit(GetLastError());

bool created = GetLastError() == 0;

void *block = MapViewOfFile( handle,
                             FILE_MAP_ALL_ACCESS,
                             0,
                             0,
                             size);

if (block == NULL)
    exit(GetLastError());

在一个特定情况下, CreateFileMapping成功返回句柄。 GetLastError返回ERROR_ALREADY_EXISTS ,因此created == false 现在,使用与传递给CreateFileMapping大小相同的MapViewOfFile调用返回NULLGetLastError返回0x05ERROR_ACCESS_DENIED 该进程以管理员权限运行。

MSDN文档没有真正提到出现这种情况的任何原因。 那么为什么CreateFileMapping成功,但MapViewOfFile失败了?

===============>>#1 票数:7 已采纳

我确定调用MapViewOfFile可能出现ERROR_ACCESS_DENIED原因有很多。 在我的特殊情况下,这是由于size参数。

提示是created == false的事实。 它显示已创建对象"Global\\\\Object_Name" 无论出于何种原因,创建调用都会以较小的大小初始化该节。 对于看似疏忽的事情,第二次调用CreateFileMapping将很乐意为您提供已存在对象的句柄,即使您要求更大的映射。

MapViewOfFile的调用现在失败了,因为它正在请求一个比实际部分更大的视图。

因此,如果您遇到类似情况,第二次调用MapViewOfFile失败,请检查您尝试映射到的大小。

可能是第二个项目正在使用不同的结构对齐进行编译,导致sizeof()运算符确定不同的值,或者某些其他大小确定函数的行为不符合预期。

===============>>#2 票数:7

在经历了很多苦难之后,我终于找到了导致我的应用程序出现此错误的原因,万一其他人正在努力解决这个问题,问题不在于MapViewOfFile方法,而是使用CreateFileMapping,createFileMapping的大小应该是文件的大小,而不是要读取的元素的大小,如果你不知道大小那么它应该是0,这不适用于MapViewOfFile作为要传递的值,因为size是你想要的块的长度读/写。

您的代码工作方式如下:

const char *name = "Global\\Object_Name";
unsigned long size = get_object_size();

HANDLE handle = CreateFileMapping(INVALID_HANDLE_VALUE,
                                  NULL,
                                  PAGE_READWRITE,
                                  0,
                                  0,
                                  name);

if (!handle || handle == INVALID_HANDLE_VALUE)
    exit(GetLastError());

bool created = GetLastError() == 0;

void *block = MapViewOfFile( handle,
                             FILE_MAP_ALL_ACCESS,
                             0,
                             0,
                             size);

if (block == NULL)
    exit(GetLastError());

只是把它放在这里记录我发现的东西,遗憾的是当你不知道是什么导致它时很难找到这个错误。 我希望这可以节省几个小时给别人。

  ask by Anthony translate from so

未解决问题?本站智能推荐:

1回复

MapViewOfFile发送一个整数到子进程

所以我试图从服务器端向客户端传递一个整数a a = 3,问题是当我在客户端上打印消息的printf而不是3时,显示的值是一个随机数(类似于19923)我试图在服务器端传递a by值(&a),但随后显示的值是一个心形。请先查看该通信有什么问题,谢谢。
1回复

为什么CreateProcessWithTokenW失败并出现ERROR_ACCESS_DENIED

我有一个CreateDrocessWithTokenW调用失败,访问被拒绝。 任何想法如何调试这个? 对CreateProcessWithTokenW的调用如下: https : //github.com/fschwiet/PShochu/blob/master/PShochu/Pinv
1回复

CreateFileA失败,出现ERROR_ACCESS_DENIED

我需要检索目录的句柄,以便能够在其上调用ReadDirectoryChangesW 。 实际上我需要更多的东西,但让我们先轻松一点。 我把问题缩小到了这个范围: 这将返回一个INVALID_HANDLE_VALUE ,最后一个错误代码为ERROR_ACCESS_DENIED 。 毋
1回复

MapViewOfFile返回错误5(ERROR_ACCESS_DENIED)

我正在尝试开发一个使用共享内存在两个进程之间进行通信的系统。 一个进程是一个32位应用程序,并使用32位dll进行通信。 另一个过程是一个64位应用程序,并使用一个64位dll,其中包含与创建/打开共享内存完全相同的代码。 我这样做的目的是,只要一个进程打开了内存的句柄而无法打开它,它就会
3回复

为什么OpenProcessToken失败并显示ERROR_ACCESS_DENIED

我正在以Administrators组中的用户身份运行一个进程,试图获取另一个进程的进程令牌。 另一个进程由不在Administrators组中的用户运行。 这是我正在使用的代码的要点。 此代码中的pid表示非管理员进程的进程ID。 所有这些都在Windows XP SP 2上,并且都在
4回复

具有跨进程(未)同步多线程访问的CreateFileMapping和MapViewOfFile?

我使用共享内存区域将som数据发送到第二个进程。 第一个过程使用CreateFileMapping (INVALID_HANDLE_VALUE, ..., PAGE_READWRITE, ...)和MapViewOfFile ( ... FILE_MAP_WRITE) 。 第二个过程使用Open
1回复

使用MapViewOfFile分配静态共享内存

如何将共享内存分配给如下所示的静态缓冲区,但如何使用CreateFileMapping和MapViewOfFile。 目标是创建一个静态共享缓冲区,该缓冲区在C ++和FORTRAN应用程序之间共享,就像使用data_seg时所做的那样。 创建动态分配的缓冲区时,FORTRAN变得棘手
1回复

CreateFileMapping / MapViewOfFile返回的共享内存数组是否已初始化为零?

只是好奇我是否在Windows平台上创建共享内存阵列,如下所示: 我第一次调用此代码片段时是否将内存数组初始化为0? 如果不是,如何将其初始化为零?
1回复

无法写入共享内存。 java.lang.Error:无效的内存访问错误

我正在尝试使用JNA制作共享内存并对其进行写入。 我非常感谢您的帮助。 这是我的代码: 因此,当我运行test()时,一切似乎都很好,直到我尝试使用SharedMemoryData.setByte(0,(byte)2);写入内存的最后一行。 这是我得到的错误: 有谁知道问题出在哪里,或者有
1回复

尝试从用户模式进程创建全局文件映射对象失败

我有一个无需提升即可运行的Windows应用程序。 我需要为要在应用程序的所有运行实例之间共享的内存阵列创建文件映射对象(请注意,其中一些实例可能在不同的登录会话中运行。) 我使用安全描述符调用具有全局名称(即Global\\sharedname的CreateFileMapping AP