我需要使用_wfopen_s
函数打开存储在应用程序包中的文件,但它返回一个FILE
对象,其中包含NULL _ptr
。它发生在这样:
var file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync("test\\test.ext");
var nativeWorker = new NativeWorker(file.Path);
<...>
auto err = _wfopen_s(&this->_myFile, fileName->Data(), L"rb");
返回的err
为0,但是调试器显示msvcr110d.dll中某处发生了错误,this->_myFile
的所有字段都为NULL,除了_flag
等于1且_file
等于3。
为了确定文件本身是否有问题,我写了一个类似于此处显示的代码段:How to prevent lost save data when upgrade app on WP8 using cpp。它看起来像这样:
FILE *tmp;
auto tmpPath = Windows::Storage::ApplicationData::Current->LocalFolder->Path + "\\tmp.txt";
auto tmpErr = _wfopen_s(&tmp, tmpPath->Data(), L"w");
结果几乎相同,只是_flag
的{{1}}属性现在等于2。
我正在创建一个标准的XAML应用程序,这是在Windows Phone运行时组件中完成的。但我很确定并非如此,因为我已经创建了一个3D原生应用程序,并且在那里也是如此。它甚至发生在从单元测试项目中引用的Windows应用商店运行时组件中。
我不能拒绝使用tmp
结构,因为它是我使用的第三方DLL请求的。也许我错过了一个权限,或者有一种方法可以将WinRT的FILE
转换为IRandomAccessStream
,所以我可以使用FILE
的API?最后一个会让我的生活变得如此简单:)
答案 0 :(得分:1)
这是fopen函数族的预期行为。返回的FILE*
非空; <-1}}指向的_ptr
成员可能为空。
FILE
成员指向流缓冲区中将进行下一次读取或写入的位置。缓冲区被懒惰地初始化,因此您还没有完成任何I / O,因此没有为流创建缓冲区。因此,_ptr
为空(_ptr
为空且_base
为零)。
您对_cnt
的来电正在成功。如果失败,_wfopen_s
本身将为null,返回的状态代码将为非零。
是否有将WinRT的
FILE*
转换为IRandomAccessStream
的方法?
没有
答案 1 :(得分:0)
嗯,问题是缺乏经验:)似乎我编译的第三方DLL使用的不同的C ++ Runtime比Windows Runtime组件,所以问题是FILE *指针不兼容。解决方案是要么不从WinRT组件传递FILE *指向此DLL(并使用其他funcs),要么尝试使用相同的运行时构建DLL和WinRT组件(虽然我不确定它是否可行,因为它似乎是Windows运行时组件使用特殊的“app”运行时。)