【问题标题】:Open PDF file after WiX installation, without showing any errors安装 WiX 后打开 PDF 文件,不显示任何错误
【发布时间】:2015-02-04 21:22:18
【问题描述】:

我想在我的 WiX 安装程序完成后打开一个 PDF 文件。

我目前拥有的相关 WiX XML 是:

<Property Id="WixShellExecTarget" Value="[#Manual.pdf]" />

<CustomAction Id="ShowManual" 
    Return="ignore" 
    BinaryKey="WixCA"
    DllEntry="WixShellExec" 
    Impersonate="yes" />

<InstallExecuteSequence>
    <Custom Action="ShowManual" After="InstallFinalize">NOT Installed</Custom>
</InstallExecuteSequence>

这一切都可以在安装了 PDF 阅读器的机器上正常运行。但如果不是,Windows 会闪烁一条消息说“Windows 无法打开这种类型的文件”。

如果有与 PDF 文件关联的应用程序,有什么方法可以让 WiX 仅尝试调用 ShellExecute?或者是否可以让调用静默失败而不显示任何错误?

【问题讨论】:

  • 您能否进行 RegistrySearch 以查看是否处理了扩展并使其成为您的 CustomAction 的条件
  • @CheGueVerra 我没有想到这一点,但我知道所需的注册表项可能会根据 Windows 的版本而改变。如果可能的话,我宁愿避免使用注册表
  • 您可以检测Windows的版本搜索相应的注册表值。否则,我看不到您如何检查是否可以打开 PDF
  • 我认为位置在不同版本的 Windows 上没有变化,但我没有检查。在 HKCR\.pdf 下寻找一些东西是一个开始的地方,但你是对的,它可能不可靠。否则,您需要先运行在 pdf 上执行 ShellExecute 的代码,然后再尝试打开 pdf。
  • @PhilDW 我查过了,Windows 8上没有设置HKCR\.pdf值,所以不同版本有区别

标签: wix shellexecute wix3.8


【解决方案1】:

我通过创建一个在InstallFinalize 之后运行并使用FindExecutable 在尝试打开应用程序之前检查应用程序是否与 PDF 文件关联的“立即”托管自定义操作解决了这个问题:

[DllImport("shell32.dll", EntryPoint = "FindExecutable")]
private static extern long FindExecutable(string lpFile, string lpDirectory, StringBuilder lpResult);

[CustomAction]
public static ActionResult ShowPdf(Session session)
{
    var installDir = session["INSTALLDIR"];
    var pdfPath = Path.Combine(installDir, @"My Dir\My.pdf");

    var pdfReaderPath = new StringBuilder(1024);
    long lngResult = FindExecutable(pdfPath, String.Empty, pdfReaderPath);

    if ((lngResult >= 32) && (!String.IsNullOrWhiteSpace(pdfReaderPath.ToString())))
    {
        Process.Start(pdfPath);
    }

    return ActionResult.Success;
}

【讨论】:

  • 不需要的代码。增加依赖性和脆弱性。有一种更简单更优雅的方式来完成这个要求。
  • @ChristopherPainter 很公平,但我不相信构建和捆绑单独的可执行文件要简单得多。我还确认注册表方法比您想象的更复杂,因为在 Windows 8 中未设置 HKCR\.pdf 值。我宁愿使用在所有 Windows 版本中都一致的定义良好的 API
猜你喜欢
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 2015-03-20
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
相关资源
最近更新 更多