Как получить доступ к папке RoamingState UWP, когда она вызывает мою DLL?

Я не могу заставить С++ работать с вызовом "ms-appdata:///roaming/" для извлечения файлов

В настоящее время я использую cpp для написания редактора методов ввода на китайском языке, и он упакован как dll.
Поэтому, когда я вызываю ifstream для чтения моего файла настроек, права доступа к файлу ограничиваются активным приложением, например что касается случаев, когда универсальная программа Windows, которая изолирована в своих собственных папках в AppData и не может даже читать другие файлы, не говоря уже о записи в них. Моя текущая трудность заключается в первую очередь в поиске файлов (в частности, файла настроек) в этой песочнице.

Например, эта строка:

WCHAR* FileName2 = L"C:/Users/Dog/AppData/Local/Packages/Facebook.317180B0BB486_8xx8rvfyw5nnt/RoamingState/Settings.txt";

отлично работает с

std::ifstream settingsFile;
settingsFile.open(FileName2, std::ios::in ); //this reading is successful for hard-coded path
settingsFile.get(myChar);
settingsFile.close();

когда facebook messenger является активной программой, но эта строка не работает:

WCHAR* FileName2 = L"ms-appdata:///roaming/Settings.txt";

Несмотря на то, что я не могу жестко указать путь для каждого каталога UserProfile и UWP.

Кто-нибудь знает, что я могу делать неправильно? Я использую Visual Studio 2015 Community в Windows 10 и имею универсальный файл настроек для x86 и x64 EXE, и я планирую написать службу для копирования этого файла настроек в папку RoamingState каждого UWP при каждом изменении этого файла.


person HelloDog    schedule 29.09.2016    source источник


Ответы (1)


Используйте свойство Windows::Storage::ApplicationData::RoamingFolder::Path, чтобы получить полный путь к перемещаемой папке:

https://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.applicationdata.roamingfolder.aspx

https://msdn.microsoft.com/en-us/library/windows/apps/windows.storage.storagefolder.path.aspx

«ms-appdata://» работает только с файловыми API WinRT.

Вот как получить доступ к этому API из стандартного C++:

#include <cstdint>
#include <string>
#include <windows.storage.h>
#include <wrl.h>

using namespace ABI::Windows::Storage;
using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;

std::wstring GetRoamingFolderPath()
{
    ComPtr<IApplicationDataStatics> appDataStatics;
    auto hr = RoGetActivationFactory(HStringReference(L"Windows.Storage.ApplicationData").Get(), __uuidof(appDataStatics), &appDataStatics);
    if (FAILED(hr)) throw std::runtime_error("Failed to retrieve application data statics");

    ComPtr<IApplicationData> appData;
    hr = appDataStatics->get_Current(&appData);
    if (FAILED(hr)) throw std::runtime_error("Failed to retrieve current application data");

    ComPtr<IStorageFolder> roamingFolder;
    hr = appData->get_RoamingFolder(&roamingFolder);
    if (FAILED(hr)) throw std::runtime_error("Failed to retrieve roaming folder");

    ComPtr<IStorageItem> folderItem;
    hr = roamingFolder.As(&folderItem);
    if (FAILED(hr)) throw std::runtime_error("Failed to cast roaming folder to IStorageItem");

    HString roamingPathHString;
    hr = folderItem->get_Path(roamingPathHString.GetAddressOf());
    if (FAILED(hr)) throw std::runtime_error("Failed to retrieve roaming folder path");

    uint32_t pathLength;
    auto roamingPathCStr = roamingPathHString.GetRawBuffer(&pathLength);
    return std::wstring(roamingPathCStr, pathLength);
}
person Sunius    schedule 03.10.2016
comment
Я не могу заставить работать пространство имен Windows::Storage: imgur.com/a/LP7hH . Что-то не так с моей конфигурацией, или я делаю что-то еще не так? - person HelloDog; 03.10.2016
comment
Код Windows::Storage::ApplicationData::RoamingFolder::Path на самом деле недействителен, я просто использовал этот синтаксис для ссылки на этот API. В любом случае, каковы настройки/тип вашего проекта? - person Sunius; 03.10.2016
comment
Я думаю, что это правильный синтаксис (по крайней мере, он отображается таким образом, когда я вставляю его в образцы кода Microsoft), но он все еще отображается как ошибка при вставке в проект dll, над которым я работаю: imgur.com/a/8Ij2i Кроме того, вот общая конфигурация моего проекта DLL: imgur.com/a/tQC4m Что-то не так там, где-то в настройках, или ошибка возникает из-за чего-то совсем другого? - person HelloDog; 03.10.2016
comment
Я попробую, а потом сообщу; Спасибо! - person HelloDog; 05.10.2016