CreateFile2在Windows 8中返回拒绝访问错误

时间:2012-08-28 02:39:19

标签: windows-8 windows-runtime visual-studio-2012

我编写了以下代码行来打开InstalledFolder目录下的文件:

Platform::String^ locationPath = Platform::String::Concat(Package::Current->InstalledLocation->Path, "\\Assets\\Logo.png");

CREATEFILE2_EXTENDED_PARAMETERS extendedParams = {0};
extendedParams.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
extendedParams.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
extendedParams.dwFileFlags = FILE_FLAG_SEQUENTIAL_SCAN;
extendedParams.dwSecurityQosFlags = SECURITY_ANONYMOUS;
extendedParams.lpSecurityAttributes = nullptr;
extendedParams.hTemplateFile = nullptr;

Wrappers::FileHandle file(
    CreateFile2(
        locationPath->Data(),
        GENERIC_READ,
        0,
        OPEN_EXISTING,
        &extendedParams
        )
    );

DWORD e = GetLastError();
if (file.Get() == INVALID_HANDLE_VALUE)
{
    throw ref new Platform::FailureException();
}

CreateFile2返回拒绝访问错误。有人可以帮帮我吗?

根据JP Alioto的建议,我尝试使用WinRT文件I / O,如下所示

    create_task(StorageFile::GetFileFromApplicationUriAsync(ref new Windows::Foundation::Uri("ms-appx:///Assets/Logo.png")))
    .then([=](StorageFile^ f)
    {
        auto p = create_task(f->OpenAsync(FileAccessMode::Read));
        p.wait();
    });

我仍然在p.wait()中收到以下错误:

  

将无效参数传递给认为无效参数致命的函数

谢谢,

1 个答案:

答案 0 :(得分:6)

您正在为0传递dwShareModeCreateFile2的文档说明了这个值......

  

如果文件或设备请求删除,读取或写入访问,则阻止其他进程打开文件或设备。仅当应用程序具有对文件的写访问权时,才授予对文件或目录的独占访问权。

您对包中的文件没有写入权限,这就是您获得访问被拒绝错误的原因。您需要将共享模式设置为FILE_SHARE_READ