【问题标题】:C CreateFileMapping error 5 Access Denied ALWAYSC CreateFileMapping 错误 5 始终拒绝访问
【发布时间】:2013-12-07 22:27:57
【问题描述】:

我想求助于WINAPI函数CreateFileMapping(),它总是返回NULL。在 GetLastError() 之后,我得到 5 -“ERROR_ACCESS_DENIED 5 (0x5) Access is denied”。在 CreateFile 之后创建文件没有问题,但是在 CreateFileMapping 之后一直没有成功。

int MapDestFile(LPCWSTR fPath)
{
hDestFile = CreateFile(
    fPath,
    GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL,
    CREATE_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,
    NULL);
if (hSourceFile == NULL)
{
    printf("%d\n", GetLastError());
}

hDestMapFile = CreateFileMapping(
    hDestFile,
    NULL,
    PAGE_READWRITE,
    0,  
    10,
    NULL
    );
if (hDestMapFile == NULL)
{
    // here always tell error number 5
    printf("%d\n", GetLastError());
}
lpMapAddressDestFile = MapViewOfFile(
    hDestMapFile,
    FILE_MAP_WRITE,
    0,
    0,
    0);

if (lpMapAddressDestFile == NULL)
{
    printf("%d\n", GetLastError());
}

return 1;
}

如果有任何建议,我将不胜感激。

谢谢

【问题讨论】:

    标签: winapi


    【解决方案1】:

    您需要使用GENERIC_WRITE | GENERIC_READ 创建文件以匹配PAGE_READWRITE

    仔细想想,这似乎是不言而喻的。你怎么能有一个你不能读取的文件支持你可以读取的内存? documentation 在任何情况下都会明确指出这一点:

    PAGE_READWRITE

    hFile 参数指定的文件句柄必须使用 GENERIC_READ 和 GENERIC_WRITE 访问权限创建。

    最重要的是,您对CreateFile 的调用的错误检查是错误的。再看一下文档。错误由返回值INVALID_FILE_HANDLE 指示。

    【讨论】:

    • 谢谢。但与 INVALID_HANDLE_VALUE 情况相同。 CreatFile(...) 没问题,我在文件浏览器中看到了该文件。 HANDLE 有效,但 CreatingFileMapping 失败。我没有提到的重要一点是,我需要写入文件,所以 GENERIC_READ 不适合我。我也在运行Win7(也许这些信息有一些价值)。
    • 我认为您需要再次阅读答案。我已经扩展了它,并重新订购了它。读第一句。 GENERIC_WRITEGENERIC_READ 的想法是它们不是或。你需要他们两者。使用按位或根据我的回答来指定。
    猜你喜欢
    • 2012-08-05
    • 2017-02-24
    • 2013-06-06
    • 2011-03-01
    • 2014-04-05
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多