2016-09-29 9 views
2

Я не могу получить C++ для работы с «мс-AppData: /// роуминг /» вызов для получения файловКак получить доступ к папке RoamingState в UWP при вызове моей DLL?

я в настоящее время с помощью CPP, чтобы написать китайский Input Method Editor, и он упакован в качестве длл.
Поэтому, когда я делаю вызов 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 в Windows 10 и имею универсальный файл настроек для x86 и x64 EXE, и я планирую написать службу для копирования этого файла настроек в папку RoamingState каждого UWP всякий раз, когда этот файл изменяется.

ответ

2

Используйте Windows :: Хранение :: 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

«мс-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); 
} 
+0

Я не могу получить для Windows :: хранения имен работы: http://imgur.com/a/LP7hH. Что-то не так с моей конфигурацией, или я делаю что-то еще неправильно? – HelloDog

+0

«Windows :: Storage :: ApplicationData :: RoamingFolder :: Path» на самом деле не действительный код, я просто использовал этот синтаксис для ссылки на этот API. В любом случае, какие у вас настройки/тип проекта? – Sunius

+0

Я думаю, что это правильный синтаксис (по крайней мере, он появляется таким образом, когда я вставляю его в образцы кода Microsoft), но он по-прежнему отображается как ошибка при вставке в проект dll, над которым я работаю: http: //imgur.com/a/8Ij2i Также приведена общая конфигурация моего проекта DLL: http://imgur.com/a/tQC4m Есть ли что-то в этом месте, в другом месте настроек, или это ошибка что-то другое? – HelloDog