如果 运行 来自以管理员身份启动的应用程序,ShellExecute 将失败

ShellExecute Fails if Run from Application Launched as Administrator

我的 C++ 应用程序使用 ShellExecute 打开 PDF 文件。我正在使用 Windows 10 Enterprise LTSC(版本 1809,OS 内部版本 17763.615)来 运行 我的应用程序。如果我的应用程序以管理员身份启动(右键单击 Run as administrator),则它无法打开 PDF 文件。但是,如果我的应用程序 在没有管理员权限 的情况下启动(只需双击它),那么 Adob​​e(默认 PDF reader)就会成功启动并且 PDF 会正确显示。

我的应用程序 运行 在 Windows 7 和 Windows 10 Pro 上正常运行(有和没有 Run as admin)。这个问题刚刚开始发生,因为我们正在尝试使用 Windows 10 Enterprise LTSC。

我的应用程序的实际代码是:

ShellExecute(NULL, NULL, full_path.toWideCharPointer(), NULL, NULL, SW_SHOWDEFAULT);

其中 full_path 例如等于 "C:\Faxitron\Docs\Guide.pdf".

在这两种情况下(管理员或非管理员),ShellExecute 总是 returns 42 和 GetLastError returns 0。这里有一些有趣的事情:当 运行以管理员身份打开我的应用程序,任务管理器在我的应用程序下显示 Adobe Acrobat Reader DC (32 bit) 的 2 个进程,但程序 Adob​​e 从来没有 launched/opened.

不确定这是否相关,但我使用的是最新版本的 Adob​​e Acrobat Reader DC(版本 19.012.20034)。

最后,我的应用程序需要 运行 作为管理员(其他功能才能正常工作)。当以管理员身份 运行ning 应用程序时,有没有办法让 ShellExecute 工作?

ShellExecute 无法从 提升的进程 启动 PDF 查看器的原因,在这种情况下,是因为 Adob​​e Reader 通过其保护模式。要解决此问题,请执行以下操作禁用保护模式:

  1. 打开 Adob​​e Reader。
  2. 选择编辑 > 首选项...
  3. 在左侧的类别列表中,select安全(增强)。
  4. 沙盒保护部分,deselect 启动时启用保护模式
  5. 单击确定 保存更改。
  6. 关闭 Adob​​e Reader.

有关 保护模式 (和可能的漏洞)的更多信息,请参阅来自 Adobe.com 的 link: https://www.adobe.com/devnet-docs/acrobatetk/tools/AppSec/protectedmode.html