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

Я не могу заставить C ++ работать с вызовом 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 является активной программой, но эта строка не:

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

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

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

2

Решение

Используйте свойство 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);
}
2

Другие решения

Других решений пока нет …