Открытие ассоциации файлов запускает приложение ClickOnce с пустой командной строкой - PullRequest
0 голосов
/ 25 февраля 2019

Я занимаюсь разработкой приложения VB.NET для Windows Forms для редактирования файлов с расширением *.fltp и хочу использовать развертывание ClickOnce.Но часть моих манифестов, связанная с файловой ассоциацией, похоже, не работает.

Начиная с моего времени программирования на C ++, я понимаю, что двойной щелчок по файлу в проводнике Windows заставляет Windows выполнять следующие действия.:

  1. Сканирование реестра на расширение файла (скажем, *.doc)
  2. Обнаружение в реестре того, что расширение файла зарегистрировано в схеме командной строки (в данном случае, winword.exe %1)
  3. Запустите эту командную строку (то есть winword.exe "Untitled.doc").

Теперь, ClickOnce не предлагает такой детальный контроль;в MSVS я просто захожу в параметры публикации и связываю свое приложение с *.fltp.Я предположил, что это следует общей схеме внесения App.exe %1 в реестр, и написал свое заявление в эту спецификацию.

При развертывании приложения создается впечатление, что приложение зарегистрировано в *.fltp файлах: их значок и описание изменяются, и двойной щелчок по ним в проводнике Windows открывает приложение.

Но командная строка пуста, поэтому мое приложение просто открывает пустой новый документ!Когда я помещаю в один из моих файлов

Private Sub Init(sender As Object, e As EventArgs) Handles MyBase.Load
    MsgBox(Command)
End Sub

, развернутое приложение просто показывает пустое окно сообщения.(То же поведение проявляется, если я использую System.Windows.Forms.Messagebox.Show, System.Environment.GetCommandLine или My.Application.CommandLineArgs - виноваты не устаревшие функции VB.)

Записи реестра аналогичны тем, что для приложения C ++, но не идентичны, поэтому я не могу понять, что они делают.

Как узнать, на каком файле дважды щелкнул пользователь?

1 Ответ

0 голосов
/ 25 февраля 2019

Вы правильно сделали вывод, что ClickOnce не передает файл в качестве аргумента командной строки.

Проблема здесь в том, что ClickOnce (как правило) проверяет наличие обновлений приложения прямо при запуске приложения.Таким образом, если ClickOnce использовал фиксированную схему реестра, которую вы описываете для приложений C ++, Windows может запустить приложение с расположением файла в командной строке, ClickOnce поймет, что ему необходимо обновить приложение, быстро загрузить новый исполняемый файл и обновить реестр, и запустить реестр.обновленный исполняемый файл в новом процессе, случайно раздавив командную строку по пути.Таким образом, он сохраняет файл в Appdomain, выполняет все необходимые действия по обновлению, а затем запускает приложение в дочернем Appdomain.

TL; DR: Вы хотите AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData вместо командной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...