_wfopen_s在Windows Phone应用程序中无法正常工作

时间:2013-11-16 22:03:10

标签: c++ visual-c++ windows-phone-8 windows-runtime windows-phone

我需要使用_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?最后一个会让我的生活变得如此简单:)

2 个答案:

答案 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”运行时。)