簡體   English   中英

無法在C ++(Directx應用)中打開文件訪問被拒絕

[英]Unable to open files in c++ (directx app) access denied

我正在嘗試使用DirectX 11項目打開DDS文件,但是,在大多數情況下,它拒絕打開它。 每次失敗,我都會收到E_ACCESSDENIED錯誤。 使其起作用的唯一方法是將相對路徑放入當前目錄或子目錄。 如果它是父目錄的相對路徑,或者是絕對路徑,則該函數將失敗。

問題是我希望使用FileOpenPicker打開圖像,因此在每種情況下,我都有一個絕對路徑...

我將分享我的功能:

void Element::FileOpenDialog()
{
    FileOpenPicker^ fileOpenPicker = ref new FileOpenPicker();
    fileOpenPicker->ViewMode = PickerViewMode::Thumbnail;
    fileOpenPicker->SuggestedStartLocation = PickerLocationId::PicturesLibrary;
    fileOpenPicker->CommitButtonText = "Load";
    fileOpenPicker->FileTypeFilter->Append(".dds");
    create_task(fileOpenPicker->PickSingleFileAsync()).then([this](StorageFile^ file)
    {
        if (file)
        {
            m_fullPath = const_cast<wchar_t*>(file->Path->Data());
            wcout << m_fullPath  << endl; // prints the correct path of the selected file

            m_loadedImage = false;
        }
        m_choseImage = true; // Checking in another code if the user chose an image to load.
    });
}

然后,我調用該函數以加載紋理...

bool Texture::LoadFile(wchar_t* path, GameWindow^ gameWindow)
{
    m_gameWindow = gameWindow;
    ComPtr<ID3D11Resource> resource = nullptr;
    if (!FH::ThrowIfFailed(CreateDDSTextureFromFile(m_gameWindow->dev.Get(), L"texture.dds", resource.GetAddressOf(), m_texture.ReleaseAndGetAddressOf()))) return false; // Works
    if (!FH::ThrowIfFailed(CreateDDSTextureFromFile(m_gameWindow->dev.Get(), L"texture\\texture.dds", resource.GetAddressOf(), m_texture.ReleaseAndGetAddressOf()))) return false; // Works
    if (!FH::ThrowIfFailed(CreateDDSTextureFromFile(m_gameWindow->dev.Get(), L"..\\texture.dds", resource.GetAddressOf(), m_texture.ReleaseAndGetAddressOf()))) return false; // E_ACCESSDENIED
    if (!FH::ThrowIfFailed(CreateDDSTextureFromFile(m_gameWindow->dev.Get(), path, resource.GetAddressOf(), m_texture.ReleaseAndGetAddressOf()))) return false; // E_ACCESSDENIED
    return true;
}

好吧,由於我不知道為什么,所以這就是為什么我來這里尋求您的幫助。

非常感謝你!

UWP應用程序無法直接訪問文件選擇器正在選擇的位置。 FileOpenPicker是代表您執行此操作的代理,但是您不能使用標准文件I / O,只能使用WinRT API。 請記住,選擇的文件甚至可能不在本地文件系統上。 您具有直接I / O訪問權限的唯一文件位置是已安裝的文件夾(只讀),臨時文件夾(讀寫)和應用程序數據文件夾(讀寫)。

有關更多信息,請參見MSDN上的文件訪問和權限(Windows運行時應用程序)

一種解決方案是將選定的代理文件復制到您有權訪問的臨時文件位置,然后在該臨時副本上使用CreateDDSTextureFromFile

#include <ppltasks.h>
using namespace concurrency;

using Windows::Storage;
using Windows::Storage::Pickers;

create_task(openPicker->PickSingleFileAsync()).then([](StorageFile^ file)
{
    if (file)
    {
        auto tempFolder = Windows::Storage::ApplicationData::Current->TemporaryFolder;
        create_task(file->CopyAsync(tempFolder, file->Name, NameCollisionOption::GenerateUniqueName)).then([](StorageFile^ tempFile)
        {
            if (tempFile)
            {
                HRESULT hr = CreateDDSTextureFromFile(..., tempFile->Path->Data(), ...);
                DeleteFile(tempFile->Path->Data());
                DX::ThrowIfFailed(hr);
            }
        });
    });

這是覆蓋在對細節的DirectX工具包的wiki ,用覆蓋寫入的情況下出現為好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM