C# 使用ShellExecute在UWP应用程序中拒绝访问

C# 使用ShellExecute在UWP应用程序中拒绝访问,c#,uwp,pinvoke,shellexecute,C#,Uwp,Pinvoke,Shellexecute,我正在将一个C WinForm应用程序转换为UWP 旧应用程序使用pinvoke ShellExecute API打开一些文件。 我正在尝试将相同的代码复制到新应用程序, 但是有一个例外 这是我的密码: public static readonly int SHELL_EXECUTE_ERROR_CODE_LIMIT = 32; [DllImport("shell32.dll")] static extern IntPtr ShellExecute(

我正在将一个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

错误\u访问\u被拒绝

5 0x5

你能帮我理解为什么我被拒绝访问吗? 以管理员身份运行Visual Studio时也会发生这种情况。

也许您可以试试

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

我在我的应用程序中使用过很多次,它可以正常工作

我假设在UWP中有一个替代品用于使用PInvok执行此ShellExecute。但是在我的代码中有很多不同的PInvoke调用,我想以尽可能少的更改将我的代码从旧应用程序复制粘贴到新应用程序中。你希望某些事情成为可能并不能使它成为可能。如果您不允许从UWP使用ShellExecute,那么您希望按原样使用现有代码的愿望就没有任何意义了。@DavidHeffernan,我在哪里可以找到您不允许使用UWP中的ShellExecute的文档?我不是专家,但我会从ShellExecute的文档开始,该文档说明它仅用于桌面应用程序。@RikiCoder-列表如下:例如:StgOpenStorage在该列表中,其文档在此处明确提到[桌面应用程序| UWP应用程序]。ShellExecuteEx不在该列表中,它只提到[桌面应用程序]有各种各样的事情是不允许你用UWP做的。ShellExecute太强大了。选中此项:运行文件:文件路径来自何处?如果您有权访问该文件,例如用户通过“文件打开”对话框选择该文件,或者该文件位于您的应用程序文件夹中,则使用Windows.System.Launcher类。另外,ShellExecute不会返回Win32错误代码。您需要使用ShellExecuteEx来实现这一点。当然,这也不起作用,但至少你会得到正确的错误处理。