2014-11-02 58 views
0

我想获取有关用户使用FileOpenPicker选择的文件的某些文件信息,但所有信息(如路径和名称)均为空。当我尝试查看对象的断点我得到了以下信息:Windows 8应用程序FileOpenPicker np文件信息

文件= 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中,因此是混淆的诊断消息。根本看不到实际的对象,访问其属性需要调用代理方法。调试器无法做到的事情,代理会将调用从一个线程编组到另一个线程,而另一个线程在调试器中断处于活动状态时被冻结。

这使得你很盲目,在困难的情况下,你可能想写一个littler帮助程序代码来将该属性存储在局部变量中。像:

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 2014-11-10 17:22:28