Приложение 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());