Приложение Windows 8 FileOpenPicker Информация о файле np

Я пытаюсь получить некоторую информацию о файле, который пользователь выбирает с помощью 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");
    }
});
}

Кто-нибудь может увидеть, что не так с кодом или какие-то проблемы с настройками приложения, почему оно работает не так, как ожидалось.

1 ответ

Решение

Сначала объяснение, почему у вас возникают проблемы с отладкой, это случится гораздо чаще, когда вы пишете программы WinRT. Во-первых, убедитесь, что у вас включен правильный механизм отладки. Инструменты + Опции, Отладка, Общие. Убедитесь, что "Использовать управляемый режим совместимости" отключен.

Теперь вы можете проверить параметр "файл", он должен выглядеть следующим образом:

введите описание изображения здесь

Трудно, конечно, интерпретировать. То, что вы смотрите на это прокси. Это термин COM, оболочка для объектов COM, которые не являются поточно-ориентированными или находятся в другом процессе или машине. Реализация прокси находится в shell32.dll, таким образом, выводит диагностическое сообщение. Вы не можете видеть фактический объект вообще, доступ к его свойствам требует вызова прокси-методов. То, на что не способен отладчик, прокси-сервер перенаправляет вызов из одного потока в другой, что другой поток останавливается, пока прерывание отладчика активно.

Это делает вас довольно слепым, в сложных случаях вы можете написать небольшой вспомогательный код, чтобы сохранить свойство в локальной переменной. Подобно:

   auto path = file->Path;

Нет проблем, проверяя или наблюдая за этим. Теперь вы должны быть уверены, что с файлом все в порядке, и вы получите совершенно хороший путь. Обратите внимание, как писать const wchar_t* path = file->Path; получает громкую жалобу от компилятора.

Что помогает вам найти ошибку, вы не можете передать Platform::String в функцию стиля printf(). Так же, как вы не можете, скажем, с std::wstring. Вам нужно использовать функцию доступа для его преобразования. Fix:

   _snwprintf_s(buf, 1024, _TRUNCATE, 
                L"Test: '%s'\n",
                file->Path->Data());
Другие вопросы по тегам