我目前正致力于移植Boost'文件系统'库到Windows Phone 8.1。我成功地将一半有问题的功能移植到了被禁止的' Win32 API与其他更新的非禁止函数一起使用。
我现在需要解决那些没有替代Win32 API的Boost函数。基于史蒂夫盖茨的其他Boost库到WP8.1的优秀端口,以及与他的私人通信,我决定在Boost代码中使用WRL,而不是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()返回一个空字符串。任何人都可以解释我做错了什么,以及应该怎么做?
提前致谢!
答案 0 :(得分:1)
没有路径是正确的结果:图片库是一个shell文件夹,它编译来自多个位置(例如公共图片目录和用户图片目录)的数据。图片库本身没有路径。
库中的各个项可能有路径,但它们可能不是同一文件系统目录中的路径。
StorageFiles不限于文件系统中的“文件”。它们还可以包含shell中其他位置的对象和其他应用程序中的对象。所有这些都表示为文件流,但不一定有文件系统路径。