2014-11-02 2 views
0

Я пытаюсь получить некоторую информацию о файле, который пользователь выбирает с помощью FileOpenPicker, но вся информация, такая как путь и имя, пуста. При попытке просмотра объекта в контрольной точке я получил следующее сообщение:windows 8 app FileOpenPicker np info info

файл = 0x03489cd4 < Информации отсутствует, нет никаких символов, загруженных для shell32.dll >

Я использую следующий код для называя FileOpenPicker и handeling файлу

#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

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

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

enter image description here

Трудно интерпретировать конечно. То, что вы смотрите, это прокси. Это термин 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()); 
+0

Спасибо за ответ, именно это я и искал. – furrie

Смежные вопросы