Обработчик протокола

Требование: мы хотим запустить внешнее средство сравнения (например, BeyondCompare или WinMerge) с веб-страницы, через кнопку или ссылку. Пути к текстовым файлам должны быть переданы инструменту при его запуске, чтобы он распознал их и открыл их в левой и правой панелях сравнения.

Пробные решения:

1) Использование ActiveXObject в JavaScript: при этом пользователь может просто нажать кнопку / ссылку и запустить инструмент сравнения, установленный на его компьютере. Но это работает только в Internet Explorer, поэтому мы не можем пойти с этим.

Ссылка: Как запустить внешнюю программу, например блокнот, используя гиперссылку?

2) Использование Java-апплета: Из-за соображений безопасности апплетам, встроенным в браузер, не разрешен доступ к локальной файловой системе, и он выдает "исключение контроля доступа". Следовательно, мы не можем пойти с этим тоже.

Ссылка: почему мой апплет выбрасывает AccessControlException?

3) Использование обработчика протокола: мы можем настроить собственный протокол URL для запуска программы. Подобно тому, как мы используем синтаксис mailto: user@email.com, используемый для создания ссылок электронной почты, это автоматически запускает Outlook в Windows. "mailto" - это предопределенный протокол в реестре Windows.

Точно так же мы создали наш собственный протокол, скажем "launchCompareTool" в реестре, и смогли запустить любое приложение, такое как WinMerge или BeyondCompare. Тем не менее, мы не можем добиться передачи путей к файлам слева и справа в качестве аргументов приложения. Может быть, при запуске приложения нужно ожидать этих аргументов.

Ссылка: http://www.dreamincode.net/forums/topic/220444-run-program-from-server-on-client-computer/ http://msdn.microsoft.com/en-us/library/aa767914%28v=vs.85%29.aspx

В отличие от протокола "mailto", в котором аргументы "body" и "subject" передаются почтовому клиенту (например, Outlook), который их понимает. Эти инструменты сравнения не имеют таких аргументов, которые могут быть переданы из протокола.

Есть ли другой способ удовлетворить это требование?

Спасибо абдул

5 ответов

Еще один подход недавно был придуман, чтобы выполнить то же самое. По сути, этот новый подход основан на создании приложения Handler, которое представляет собой не что иное, как приложение ClickOnce на основе консоли Windows. Приложение ClickOnce Handler будет действовать как перехватчик между хостом (веб-страницей или внешним видом или всем, что может встраивать ссылку) и целевым приложением (например, WinMerge или Beyond Compare). Приложение Handler будет вызываться по щелчку встроенной ссылки в хост-приложении. Ссылка - это не что иное, как http-URL, который будет содержать информацию в параметре querystring. Поскольку приложение-обработчик развернуто в ClickOnce, оно позволяет публиковаться на веб-сервере. Встроенная ссылка (HTTP URL) вызовет приложение-обработчик, а затем приложение-обработчик проанализирует полученные параметры строки запроса и, наконец, вызовет соответствующее целевое приложение. Приложение-обработчик можно рассматривать как приложение анализатора Click Once Deployed. Ниже приведена подробная статья с примером кода в http://www.codeproject.com/Articles/545083/Custom-HyperLinks-Using-a-Generic-Protocol-Handler.

Аншул Мехра

Пользовательский URL может вызывать пакетный файл dos или vbscript, который анализирует аргументы и затем вызывает winmerge.

Да, вы можете передать параметры таким образом. В HTML-коде это сделать

"<a href='alert:\"Hello World\"'>this link</a>"

Это сгенерирует HTML как

<a href="alert:"Hello World"">this link</a>

Он передаст вашему exe два параметра, то есть "alert:Hello" и "World". Я все еще ищу, как сделать первый параметр только "Hello" без какого-либо анализа.

У меня было похожее требование, в котором мне нужно было общаться с настольным клиентом из приложения браузера. Подход, который я выбрал, был подходом Java-апплета.

Вскоре я столкнулся с той же самой проблемой, о которой вы упомянули, то есть "исключение контроля доступа" по соображениям безопасности. Правильный способ справиться с этим - подписать апплет, и все готово. Вот шаги, которые я предпринял, чтобы подписать мой апплет,

javac MyClient.java
jar cvf MyClient.jar MyClient.class
keytool -genkey -validity 3650 -keystore pKeyStore -alias keyName
keytool -selfcert -keystore pKeyStore -alias keyName -validity 3650
jarsigner -keystore pKeyStore MyClient.jar keyName

Сначала я представлю требования.

Тогда я покажу вам, как выполнить каждое из требований

Требования:

  1. Создайте небольшое приложение командной строки, которое будет принимать путь целевого приложения в качестве параметра и после "?" будет принимать аргументы для целевого приложения.
  2. Создайте файл.reg, содержащий информацию реестра пользовательских URL.
  3. Создайте ссылку на приложение на своей веб-странице с пользовательским URL.

Давайте начнем:

  1. Создание приложения командной строки: Шаги:
    1. Откройте Microsoft Visual Studio и выберите создание нового консольного приложения с шаблоном Visual Basic. Мы назовем это "MyLauncher".
    2. В свойствах проекта >> Приложение установите целевую версию фреймворка на.NET 2.0, чтобы каждый мог использовать это приложение. C. Добавить ссылку на проект - System.Windows.Forms D. Перезаписать весь код по умолчанию в файле Module1.vb следующим образом:

Код:

 Imports System.IO
 Imports System.Threading
 Imports System
 Imports System.Windows.Forms


  Module Module1

Dim array As String()

Sub Main()

    Dim origCommand As String = ""
    Dim sCommand As String = Command().ToString

    If String.IsNullOrEmpty(sCommand) Then
        Application.Exit()
    End If

    origCommand = sCommand
    origCommand = origCommand.Substring(origCommand.IndexOf(":") + 1)
    origCommand = origCommand.Split("""")(0)

    execProgram(origCommand)

End Sub


Private Sub execProgram(ByVal sComm As String)
    Try

        Dim myPath As String = Nothing
        Dim MyArgs As String = Nothing
        Dim hasArgs As Boolean

        If sComm.Contains("""") Then
            sComm = sComm.Replace("""", "").Trim()
        End If

        If sComm.EndsWith("?") Or sComm.Contains("?") Then
            hasArgs = True
            MyArgs = sComm.Substring(sComm.IndexOf("?") + 1)
            myPath = sComm.Substring(0, sComm.IndexOf("?"))
        Else
            myPath = sComm
        End If

        If hasArgs Then
            startProg(myPath, MyArgs)
        Else
            startProg(myPath)
        End If

    Catch ex As Exception
        Dim errMsg As String = sComm & vbCrLf & vbCrLf & "The program you are trying to launch was not found on the local computer" & vbCrLf & vbCrLf & vbCrLf &
      "Possible solutions:" & vbCrLf & vbCrLf &
     "If the program doesn;t exist on the computer, please install it. " & vbCrLf & vbCrLf &
     "If you did install the program, please make sure you used the provided default path for istallation. " & vbCrLf & vbCrLf &
      "If none of the avove is relevant, please call support" & vbCrLf & vbCrLf

        If ex.Message.Contains("The system cannot find the file specified") Then

            MessageBox.Show(errMsg, "System Error", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign)
        Else
            MessageBox.Show(ex.Message, "Default Error", MessageBoxButtons.OK)
        End If
    End Try

End Sub

Private Sub startProg(myPath As String, Optional MyArgs As String = "")
    Try
        Dim proc As Process
        If Not String.IsNullOrEmpty(MyArgs) Then
            proc = New Process()
            proc.EnableRaisingEvents = False
            proc.StartInfo.FileName = myPath
            proc.StartInfo.Arguments = MyArgs
            proc.Start()
        Else
            proc = New Process()
            proc.EnableRaisingEvents = False
            proc.StartInfo.FileName = myPath
            proc.Start()
        End If
    Catch ex As Exception

    End Try

End Sub

End Module

Д. Скомпилируйте программу и, после локального тестирования, поместите ее в центральное место, желательно на сетевой диск, к которому у всех есть доступ.

2. Создайте файл.reg, содержащий следующий код:
Код:

      Windows Registry Editor Version 5.00

     [HKEY_CLASSES_ROOT\mylauncher]
     "URL Protocol"="\"\""
     @="\"URL: mylauncher Protocol\""

     [HKEY_CLASSES_ROOT\mylauncher\shell]

     [HKEY_CLASSES_ROOT\mylauncher\shell\open]

     [HKEY_CLASSES_ROOT\mylauncher\shell\open\Command]

     ;example path to the launcher is presented below. Put your own and mind the escape characters that are required.
     @="\"\\\\nt_sever1\\Tools\\Launcher\\BIN\\mylauncher.exe\" \"%1\""

A. Распространите ключ reg через центральный дистрибутив sysadmin или запустите файл.reg на каждом ПК.
Б. Использование:
mylauncher: AppYouWantToLaunchPathGoesHere ArgumentsGoHere

  1. Создайте гиперссылку на своей веб-странице:
    Код:

     <!doctype html>
     <html>
     <head>
    
      </head>
      <body>
    
       <div class="test-container">
          <a href='mylauncher:C:\Program Files\IBM\Client Access\Emulator\pcsfe.exe?U=MyUserName' >TEST</a>
       </div>
    
    
       </body>
        </html>
    


    Напишите мне, если что-то не работает. Я помогу тебе.
    Удачи друг.

Другие вопросы по тегам