Вызов fopen () в DLL из приложения UWP возвращает нулевой указатель. GetLastError () возвратил ERROR_ACCESS_DENIED - PullRequest
1 голос
/ 20 января 2020

Я работаю над приложением UWP, которое вызывает функцию из DLL. Он предоставляет функции путь установки приложения, чтобы я мог go вперед и записать в него некоторые данные.

Я импортировал DLL, используя LoadPackagedLibrary , как описано в Как : Использовать существующий код C ++ в универсальном Windows приложении на платформе .

Я нашел путь, используя Windows::Storage::StorageFolder^ installedLocation = Windows::ApplicationModel::Package::Current->InstalledLocation;.

Однако, когда я пытаюсь открыть файл и получить дескриптор, используя fopen, я получаю нулевой указатель. Я получил код ошибки, используя GetLastError(), и он вернул ERROR_ACCESS_DENINED error.

В чем может быть причина этого? Я что-то пропустил? Нужно ли объявлять дополнительные возможности, чтобы гарантировать, что DLL может обращаться к файлам в пути установки приложения?

Ответы [ 2 ]

1 голос
/ 20 января 2020

Запись в папку установки приложения UWP ограничена дизайном. Это необходимо для обеспечения целостности установки приложения и включения непрерывных автоматических c обновлений для пакета приложения.

Если вы хотите записать данные, вам нужно будет записать их в папку appdata приложения, не место установки.

0 голосов
/ 28 января 2020

fopen() полагается на CreateFile для выполнения фактической работы. CreateFile знает только, как обрабатывать ACL файловой системы, а не разрешения UWP, основанные на возможностях, и поэтому он всегда завершается ошибкой с ACCESS_DENIED для всего, кроме ваших каталогов AppData (для доступа для чтения / записи) или местоположения установки (только для чтения). access).

Существует обходной путь с использованием CreateFileFromApp, но он не будет работать для fopen(), если вы не готовы статически связать CRT, который имеет свой минусы. Например, вы не получаете автоматических исправлений безопасности c и не можете распространять их через Microsoft Store.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...