1

我目前正在将 Boost 'filesystem' 库移植到 Windows Phone 8.1。通过用其他较新的非禁止函数替换“禁止”的 Win32 API 函数,我成功地移植了大约一半的有问题的函数。

我现在需要处理那些没有替代 Win32 API 的 Boost 函数。基于 Steve Gates 对 WP8.1 的其他 Boost 库的出色移植,在与他的私人交流中,我决定在 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() 返回一个空字符串。谁能阐明我做错了什么,应该怎么做?

提前致谢!

4

1 回答 1

1

没有路径是正确的结果:图片库是一个外壳文件夹,它编译来自多个位置(例如公共图片目录和用户的图片目录)的数据。图片库本身没有路径。

库中的各个项目可能具有路径,但它们可能不是同一文件系统目录中的路径。

StorageFiles 不限于文件系统中的“文件”。它们还可以包括来自 shell 中其他地方的对象和来自其他应用程序的对象。所有这些都表示为文件流,但不一定有文件系统路径。

于 2014-11-07T14:59:28.230 回答