2016-03-24 8 views
0

Ich versuche, eine DDS-Datei mit meinem DirectX 11-Projekt zu öffnen, aber in den meisten Fällen weigert es sich, es zu öffnen. Immer wenn es fehlschlägt, erhalte ich E_ACCESSDENIED Fehler. Die einzige Möglichkeit, es zum Laufen zu bringen, besteht darin, den relativen Pfad zum aktuellen Verzeichnis oder Unterverzeichnis zu setzen. Wenn es sich um einen relativen Pfad zu einem übergeordneten Verzeichnis handelt oder wenn es sich um einen absoluten Pfad handelt, schlägt die Funktion fehl.Kann Dateien in C++ nicht öffnen (DirectX-App) Zugriff verweigert

Das Problem ist, dass ich wünschte, das Bild zu öffnen FileOpenPicker verwenden, so in allen Fällen, ich einen absoluten Pfad zu bekommen ...

Ich werde meine Funktionen teilen:

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. 
    }); 
} 

Und dann, ich rufe die Funktion, die Textur zu laden ...

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; 
} 

Nun, da ich keine Ahnung, warum haben, deshalb bin ich hierher gekommen, Ihre Hilfe zu bitten.

Vielen Dank!

Antwort

0

Eine UWP-Anwendung hat keinen direkten Dateizugriff auf den Speicherort, den die Dateiauswahl auswählt. Die FileOpenPicker ist ein Broker, der es in Ihrem Namen macht, aber Sie können nicht Standard-Datei-I/O, nur WinRT-APIs darauf verwenden. Beachten Sie, dass die ausgewählte Datei möglicherweise nicht einmal im lokalen Dateisystem vorhanden ist. Die einzigen Dateispeicherorte, auf die Sie direkten E/A-Zugriff haben, sind Ihr installierter Ordner (schreibgeschützt), ein temporärer Ordner (Lesen/Schreiben) und ein Anwendungsdatenordner (Lesen/Schreiben).

Weitere Informationen finden Sie unter File access and permissions (Windows Runtime apps) auf MSDN.

Eine Lösung ist die ausgewählte brokered Datei in einem temporären Speicherort der Datei zu kopieren, die Sie Zugang zu tun haben, und dann CreateDDSTextureFromFile auf die temporäre Kopie verwenden.

#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); 
      } 
     }); 
    }); 

there ebenfalls abgedeckt Dies wird im Detail auf den DirectX Tool Kit wiki, mit der Schreib bedeckt.

+0

Vielen Dank, ich war mir dessen nicht bewusst, und jetzt funktioniert es! – Drake

Verwandte Themen