В настоящее время я работаю над переносом библиотеки файловой системы Boost на Windows Phone 8.1. Мне удалось портировать около половины проблемных функций, заменив «запрещенные» функции Win32 API другими, более новыми, не забаненными функциями.
Теперь мне нужно разобраться с теми функциями Boost, для которых нет альтернативного Win32 API. Основываясь на превосходном порте Стива Гейтса из других библиотек Boost на WP8.1 и в личной беседе с ним, я решил использовать WRL в коде Boost, а не C ++ / CX.
Чтобы изучить WRL и ориентироваться, я написал минимальное приложение WP8.1, состоящее из клиентского приложения C ++ / CX, которое вызывает компонент времени выполнения Windows, последний написан на C ++. В компоненте времени выполнения у меня есть функция, которая пытается определить путь к файловой системе библиотеки изображений. Проблема, с которой я сталкиваюсь, заключается в том, что последний путь, который я получаю (т.е. pszPath), является пустой строкой.
Вот код компонента времени выполнения:
void Class1::Test1()
{
HRESULT hr;
HString hstrKnownFolders;
hstrKnownFolders.Set(RuntimeClass_Windows_Storage_KnownFolders);
// Get the Activation Factory
ComPtr<IActivationFactory> pKnownFoldersActivationFactory;
hr = ABI::Windows::Foundation::GetActivationFactory(hstrKnownFolders.Get(),
&pKnownFoldersActivationFactory);
if (FAILED(hr))
{
::Microsoft::WRL::Details::RaiseException(hr);
}
// QI for the IKnownFoldersStatics
ComPtr<IKnownFoldersStatics> pKnownFolders;
hr = pKnownFoldersActivationFactory.As(&pKnownFolders);
if (FAILED(hr))
{
::Microsoft::WRL::Details::RaiseException(hr);
}
// Get the Pictures library folder
ComPtr<IStorageFolder> pStorageFolder;
hr = pKnownFolders->get_PicturesLibrary(&pStorageFolder);
if (FAILED(hr))
{
::Microsoft::WRL::Details::RaiseException(hr);
}
// QI for the IStorageItem interface (from which IStorageFolder is derived)
ComPtr<IStorageItem> pItem;
hr = pStorageFolder.As(&pItem);
// Get the path corresponding to the folder
HSTRING hsPath;
pItem->get_Path(&hsPath);
PCWSTR pszPath = WindowsGetStringRawBuffer(hsPath, 0);
}
В конце функции функция get_Path () возвращает пустую строку. Может кто-нибудь пролить свет на то, что я делаю неправильно, и как это следует делать?
Заранее спасибо!
Ни один путь не является правильным результатом: библиотека Pictures — это папка оболочки, которая компилирует данные из нескольких мест (таких как общедоступный каталог Pictures и каталог изображений пользователя). Сама библиотека изображений не имеет пути.
Отдельные элементы в библиотеке, вероятно, имеют пути, но они не могут быть путями в одном и том же каталоге файловой системы.
StorageFiles не ограничиваются «файлами» из файловой системы. Они также могут включать объекты из других частей оболочки и объекты из других приложений. Все они представлены в виде файловых потоков, но не обязательно имеют пути к файловой системе.