Обработчик протокола
Требование: мы хотим запустить внешнее средство сравнения (например, 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
Сначала я представлю требования.
Тогда я покажу вам, как выполнить каждое из требований
Требования:
- Создайте небольшое приложение командной строки, которое будет принимать путь целевого приложения в качестве параметра и после "?" будет принимать аргументы для целевого приложения.
- Создайте файл.reg, содержащий информацию реестра пользовательских URL.
- Создайте ссылку на приложение на своей веб-странице с пользовательским URL.
Давайте начнем:
- Создание приложения командной строки: Шаги:
- Откройте Microsoft Visual Studio и выберите создание нового консольного приложения с шаблоном Visual Basic. Мы назовем это "MyLauncher".
- В свойствах проекта >> Приложение установите целевую версию фреймворка на.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
Создайте гиперссылку на своей веб-странице:
Код:<!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>
Напишите мне, если что-то не работает. Я помогу тебе.
Удачи друг.