2015-02-04 3 views
1

Я хочу открыть PDF-файл после завершения установки установщика WiX.Открыть файл PDF после установки WiX, без каких-либо ошибок

Соответствующий 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 не может открыть этот тип файла».

Есть ли способ получить WiX, чтобы попытаться позвонить только ShellExecute, если есть приложение, связанное с файлами PDF? Или можно ли заставить вызов терпеть неудачу без каких-либо ошибок?

+2

Couldnèt вы делаете RegistrySearch чтобы узнать, обрабатывается ли расширение и делает это условие для вашего CustomAction. – CheGueVerra

+0

@CheGueVerra. Я не думал об этом, но я понимаю, что необходимый раздел реестра может измениться в зависимости от версии Windows. Я предпочел бы избежать реестров, если это возможно – Cocowalla

+0

Вы можете обнаружить версию Windows для поиска соответствующих значений реестра. В противном случае я не вижу, как вы можете проверить, можете ли вы открыть PDF-файл – CheGueVerra

ответ

-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; 
} 
+0

Уход за голосом для комментариев? – Cocowalla

+0

Необязательный код. Увеличивает зависимость и хрупкость. Существует более простой и элегантный способ выполнить это требование. –

+0

@ChristopherPainter достаточно справедлив, но я не уверен, что создание и объединение отдельного исполняемого файла намного проще. Я также подтвердил, что метод реестра более сложный, чем вы предполагали, поскольку значение HKCR \ .pdf не задано в Windows 8. Я бы предпочел использовать хорошо определенный API, который будет согласован во всех версиях Windows – Cocowalla

Смежные вопросы