0

Мне нужно открыть файл, который хранится в пакете моего приложения, используя функцию _wfopen_s, но он возвращает объект FILE с NULL _ptr. Это происходит так:_wfopen_s не работает должным образом в приложении Windows Phone

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 свойство tmp теперь равны 2.

Я создаю стандартное приложение XAML, и это делается в Компонент времени выполнения Windows Phone. Но я уверен, что это не так, потому что я создал собственное 3D-приложение, и там же происходит. Это даже происходит в компоненте Runtime Windows Store, на который ссылается проект модульных тестов.

Я не могу отказаться от использования FILE структуры, потому что она запрашивается третьей стороной DLL, которую я использую. Возможно, есть разрешение, которое я пропустил, или, может быть, есть способ конвертировать WinRT's IRandomAccessStream в FILE, чтобы я мог просто использовать API StorageFile? Последнее облегчило бы мою жизнь :)

ответ

0

Ну, проблема заключалась в отсутствии опыта :) Похоже, что третья сторона DLL, которые я составил использует различные C++ Время воспроизведения, чем компоненты среды выполнения Windows, так что проблема несовместимости FILE * указатель , Решение состоит в том, чтобы либо не передать указатель FILE * этой DLL из компонента WinRT (и использовать другие функции), либо попытаться создать компонент DLL и WinRT с использованием той же среды выполнения (хотя я не уверен, что это возможно, потому что кажется, что Windows Компоненты времени выполнения используют специальное время выполнения приложения.

1

Это ожидаемое поведение семейства функций fopen. Возвращаемое значение FILE* не равно null; _ptr член заочного FILE может иметь значение NULL.

Элемент _ptr указывает на позицию в буфере потока, при которой происходит следующее чтение или запись. Буфер инициализируется лениво, поэтому, поскольку вы еще не сделали никаких операций ввода-вывода, для потока не создается буфер. Таким образом, _ptr имеет значение null (и _base имеет значение null и _cnt равно нулю).

Ваш звонок _wfopen_s преуспевает. Если он был сбой, сам FILE* был бы нулевым, а возвращенный код состояния был бы отличным от нуля.

Есть ли способ, чтобы преобразовать WinRT-х IRandomAccessStream в FILE?

No.

+0

Ох ... Спасибо, я не знал этого :) Но все же он бросает 'AccessDeniedException' для файла, открывшего этот стиль. – Alovchin

+0

Откуда возникает AccessDeniedException? –

+0

Ну, я использую libFLAC.dll, поэтому он приходит откуда-то оттуда.Фактически, я реализовал другой способ доступа к файлу, поэтому этот конкретный вопрос больше не является актуальным. Хотя проблема сохраняется, и я попытаюсь найти более конкретную информацию о том, где она сбой. Благодаря! – Alovchin

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