【发布时间】: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