【问题标题】:Call to fopen() in a DLL from a UWP app returns a NULL pointer. GetLastError() returned ERROR_ACCESS_DENIED从 UWP 应用调用 DLL 中的 fopen() 会返回一个 NULL 指针。 GetLastError() 返回 ERROR_ACCESS_DENIED
【发布时间】:2020-01-19 21:34:16
【问题描述】:

我正在开发一个从 DLL 调用函数的 UWP 应用程序。它为函数提供了应用程序安装路径,以便我可以继续向它写入一些数据。

我使用LoadPackagedLibrary 导入了DLL,如How to: Use Existing C++ Code in a Universal Windows Platform App 中所述。

我使用Windows::Storage::StorageFolder^ installedLocation = Windows::ApplicationModel::Package::Current->InstalledLocation; 检索了路径。

但是,当我尝试打开文件并使用fopen 获取它的句柄时,我得到一个 NULL 指针。我使用GetLastError() 检索了错误代码,它返回了ERROR_ACCESS_DENINED 错误。

这可能是什么原因?我错过了什么吗?我是否需要声明附加功能以确保 DLL 可以访问应用程序安装路径中的文件?

【问题讨论】:

    标签: visual-studio visual-c++ uwp windows-10 c++-cx


    【解决方案1】:

    写入 UWP 应用的安装文件夹受设计限制。这是为了确保应用程序安装的完整性,并为应用程序包启用无缝的增量自动更新。

    如果您想写入数据,您需要将其写入应用的 appdata 位置,而不是安装位置。

    【讨论】:

    • 我阅读了有关文件访问权限here 的 MSFT 文档。我知道有两个默认文件权限不需要额外的声明。 AppData 文件夹和 Downloads 文件夹。还提到该应用程序可以访问它创建的文件或文件夹。因此,我从 UWP 应用程序中创建了一个文件(例如在下载文件夹中),并在 DLL 中提供了它的函数路径。但是,我仍然看到同样的错误。
    • 由于我无法 fopen 提供给 DLL 中的函数的文件,因此我尝试检查它是否在 UWP 应用程序中工作。我使用CreateFileAsync 在下载文件夹中创建了一个文件,并将文件的路径提供给fopen 函数,但它仍然返回NULL。我也尝试在 AppData 文件夹中做同样的事情。这次fopen 给了我文件的句柄。为什么当 DLL 中的函数尝试做同样的事情时它不起作用?
    • 当DLL内的函数访问本地文件夹时,能否从fopen获取句柄?会不会出现同样的问题?
    • @Faywang-MSFT 每当我尝试从 DLL 中的函数fopen() 时,无论我给它什么路径,它都无法获得句柄。
    • 当我将 AppData 目录从 DLL 中的函数传递给 fopen() 时,它可以返回句柄。能否提供一个可以复制的简单样本?
    【解决方案2】:

    fopen() 依赖 CreateFile 来完成实际工作。 CreateFile 只知道如何处理文件系统 ACL,而不知道如何处理基于功能的 UWP 权限,因此对于您的 AppData 目录(用于读/写访问)或您的安装位置(用于只读)以外的任何内容,它总是以 ACCESS_DENIED 失败访问)。

    有一个work-around using CreateFileFromApp,但它不适用于fopen(),除非您愿意静态链接 CRT,这有其缺点。例如,您无法获得自动安全补丁的好处,并且您可能无法通过 Microsoft Store 分发。

    【讨论】:

      猜你喜欢
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      相关资源
      最近更新 更多