WiX 安装后打开 PDF 文件,不显示任何错误
Open PDF file after WiX installation, without showing any errors
我想在 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 reader 的机器上一切正常。但如果没有,Windows 会闪烁一条消息说“Windows 无法打开这种类型的文件”。
如果有与 PDF 文件关联的应用程序,是否有任何方法可以让 WiX 仅尝试调用 ShellExecute
?或者是否可以让调用静默失败而不显示任何错误?
我通过创建一个 'immediate' 托管自定义操作来解决这个问题,该操作在 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;
}
我想在 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 reader 的机器上一切正常。但如果没有,Windows 会闪烁一条消息说“Windows 无法打开这种类型的文件”。
如果有与 PDF 文件关联的应用程序,是否有任何方法可以让 WiX 仅尝试调用 ShellExecute
?或者是否可以让调用静默失败而不显示任何错误?
我通过创建一个 'immediate' 托管自定义操作来解决这个问题,该操作在 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;
}