2

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 File 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() で次のエラーが引き続き発生します。

無効なパラメーターが致命的と見なされる関数に無効なパラメーターが渡されました

ありがとう、

4

1 に答える 1

6

あなたは に合格0していdwShareModeます。のドキュメントにCreateFile2よると、この値は...

他のプロセスが削除、読み取り、または書き込みアクセスを要求した場合に、ファイルまたはデバイスを開くのを防ぎます。ファイルまたはディレクトリへの排他的アクセスは、アプリケーションがファイルへの書き込みアクセス権を持っている場合にのみ許可されます。

パッケージ内のファイルへの書き込みアクセス権がないため、アクセス拒否エラーが発生します。共有モードを に設定する必要がありますFILE_SHARE_READ

于 2012-08-28T05:43:06.177 に答える