0

我正在尝试获取有关用户使用 FileOpenPicker 选择的文件的一些文件信息,但路径和名称等所有信息都是空的。当我尝试在断点中查看对象时,我收到以下消息:

file = 0x03489cd4 <信息不可用,没有为 shell32.dll 加载符号>

我使用以下代码调用 FileOpenPicker 并处理文件

#include "pch.h"
#include "LocalFilePicker.h"

using namespace concurrency;
using namespace Platform;
using namespace Windows::Storage;
using namespace Windows::Storage::Pickers;

const int LocalFilePicker::AUDIO = 0;
const int LocalFilePicker::VIDEO = 1;
const int LocalFilePicker::IMAGES = 2;

LocalFilePicker::LocalFilePicker()
{
    _init();
}

void LocalFilePicker::_init()
{
    _openPicker = ref new FileOpenPicker();
    _openPicker->ViewMode = PickerViewMode::Thumbnail;
}

void LocalFilePicker::askFile(int categorie)
{
    switch (categorie)
    {
    case 0:
        break;
    case 1:
        _openPicker->SuggestedStartLocation = PickerLocationId::VideosLibrary;
        _openPicker->FileTypeFilter->Append(".mp4");
        break;
    case 2:
        break;
    default:
        break;
}

create_task(_openPicker->PickSingleFileAsync()).then([this](StorageFile^ file)
{
    if (file)
    {
        int n = 0;
        wchar_t buf[1024];
        _snwprintf_s(buf, 1024, _TRUNCATE, L"Test: '%s'\n", file->Path);
        OutputDebugString(buf);
    }
    else
    {
        OutputDebugString(L"canceled");
    }
});
}

任何人都可以看到代码有什么问题或应用程序设置有一些问题,为什么它不能按预期工作。

4

1 回答 1

4

首先解释为什么你在调试时遇到问题,当你编写 WinRT 程序时,这种情况会发生得更多。首先,请确保您启用了正确的调试引擎。工具+选项,调试,常规。确保“使用托管兼容模式”已关闭。

您现在可以检查“文件”选项,它应该类似于:

在此处输入图像描述

当然很难解释。您正在查看的是代理。它是一个 COM 术语,是对非线程安全或存在于另一个进程或机器中的 COM 对象的包装。代理实现存在于 shell32.dll 中,因此诊断消息令人困惑。你根本看不到实际的对象,访问它的属性需要调用代理方法。调试器无法做到的事情,代理将调用从一个线程编组到另一个线程,当调试器中断处于活动状态时,另一个线程被冻结。

这让你很盲目,在困难的情况下,你可能想要编写更小的帮助代码来将属性存储在局部变量中。喜欢:

   auto path = file->Path;

检查或观看那个没有问题。您现在应该确信文件没有任何问题,并且您获得了一个非常好的路径。请注意写作如何const wchar_t* path = file->Path;让您从编译器中大声抱怨。

这可以帮助您找到错误,您不能将 Platform::String 传递给 printf() 样式函数。就像你不能使用 std::wstring 一样。您需要使用访问器函数对其进行转换。使固定:

   _snwprintf_s(buf, 1024, _TRUNCATE, 
                L"Test: '%s'\n",
                file->Path->Data());
于 2014-11-09T19:44:13.913 回答