【问题标题】:ACCESS_DENIED in UWP app using ShellExecute使用 ShellExecute 在 UWP 应用程序中访问 ACCESS_DENIED
【发布时间】:2020-01-21 12:58:17
【问题描述】:

我正在将 C# WinForm 应用程序转换为 UWP。

旧应用使用 pinvoke ShellExecute API 来打开一些文件。 我正在尝试将相同的代码复制到新应用程序, 但得到一个例外。

这是我的代码:

     public static readonly int SHELL_EXECUTE_ERROR_CODE_LIMIT = 32;
     [DllImport("shell32.dll")]
        static extern IntPtr ShellExecute(
            IntPtr hwnd,
            string lpOperation,
            string lpFile,
            string lpParameters,
            string lpDirectory,
            /*ShowCommands*/int nShowCmd);

    private void btnPinvoke_Click(object sender, RoutedEventArgs e)
    {
        int ret = 0;
        IntPtr retPtr = ShellExecute(IntPtr.Zero, "open", @"C:\path\to\file\dummy.pdf", "", "", /*ShowCommands.SW_SHOWNOACTIVATE*/4);
        ret = retPtr.ToInt32();
        if (ret <= SHELL_EXECUTE_ERROR_CODE_LIMIT) //Failure
        {
            lblResult.Text = "Error " + ret;
        }
    }

返回的错误码是5。

ERROR_ACCESS_DENIED

5 (0x5)

您能帮我理解为什么会出现 ACCESS_DENIED 异常吗?
以管理员身份运行 Visual Studio 时也会发生这种情况。

【问题讨论】:

  • UWP 不允许您做各种事情。 ShellExecute 太强大了。检查这个:stackoverflow.com/questions/49189353/… 并运行一个文件:docs.microsoft.com/en-us/windows/uwp/launch-resume/…
  • 文件路径从何而来?如果您有权访问该文件(例如,用户通过“文件打开”对话框选择了该文件,或者它位于您的应用文件夹中),则使用 Windows.System.Launcher 类。
  • 顺便说一句,ShellExecute 不会返回 Win32 错误代码。为此,您需要使用 ShellExecuteEx。这当然也行不通,但至少你会得到适当的错误处理。

标签: c# uwp pinvoke shellexecute


【解决方案1】:

也许你可以试试

Diagnostics.Process.Start(@"C:\path\to\file\dummy.pdf");

我在我的应用程序中多次使用它并且它有效

【讨论】:

  • 我假设 UWP 中有一个使用 PInvok 的 ShellExecute 的替代品。但是在我的代码中有很多不同的 PInvoke 调用,我想将我的代码从旧应用程序复制粘贴到新应用程序中,尽可能减少更改。
  • 你希望某事成为可能,但这并不能使它成为可能。如果不允许您从 UWP 使用 ShellExecute,那么您按原样使用现有代码的愿望就没有任何意义。
  • @DavidHeffernan,我在哪里可以找到“不允许从 UWP 使用 ShellExecute”的文档?
  • 我不是专家,但我会从 ShellExecute 的文档开始,其中指出它仅适用于桌面应用程序。
  • @RikiCoder - 列表在此处:docs.microsoft.com/en-us/uwp/win32-and-com/… 例如:StgOpenStorage 在该列表中,其文档在此处 docs.microsoft.com/en-us/windows/win32/api/coml2api/… 明确提及“[桌面应用程序 | UWP 应用程序]”。 ShellExecute(Ex) 不在该列表中,仅提及“[桌面应用程序]”
猜你喜欢
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 2018-07-10
  • 2022-07-25
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多