协议处理程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了协议处理程序相关的知识,希望对你有一定的参考价值。
要求:我们希望通过按钮或链接从网页启动外部比较工具(如BeyondCompare或WinMerge)。文本文件路径应在其启动时传递给工具,因此它可以理解它们并在左侧和右侧比较面板中打开它们。
尝试的解决方案:
1)使用javascript的ActiveXObject:用户只需单击按钮/链接并启动其计算机上安装的比较工具即可。但它只适用于Internet Explorer,所以我们不能这样做。
参考:How to run an external program, e.g. notepad, using hyperlink?
2)使用Java Applet:由于安全原因,浏览器中嵌入的applet不允许访问本地文件系统,它将引发“访问控制异常”。因此,我们也不能同意这一点。
参考:Why is my applet throwing an AccessControlException?
3)使用协议处理程序:我们可以设置自定义URL协议来触发程序。就像我们使用mailto:user@email.com语法创建电子邮件链接一样,这将自动在Windows上启动Outlook。 “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#app_reg
与“mailto”协议不同,后者将“正文”和“主题”参数传递给了解它们的邮件客户端(如Outlook)。这些比较工具没有可以从协议传递的参数。
还有另一种方法可以满足这一要求吗?
谢谢,阿卜杜勒
最近又创造了另一种方法来执行相同的操作。基本上这种新方法继续创建一个Handler应用程序,它只是一个基于Windows控制台的ClickOnce应用程序。 ClickOnce处理程序将充当主机(网页或Outlook或任何可嵌入链接的东西)和目标应用程序(如WinMerge或Beyond Compare)之间的拦截器。单击主机应用程序中的嵌入式链接将调用Handler应用程序。链接只是一个http url,它将保存querystring参数中的信息。由于处理程序应用程序是ClickOnce部署的,因此它允许自己发布到Web服务器。嵌入式链接(HTTP URL)将调用处理程序应用程序,然后处理程序应用程序将解析收到的查询字符串参数,最后调用相关的目标应用程序。 Handler应用程序可以被视为Click Once Deployed解析器应用程序。以下是Custom-HyperLinks-Using-a-Generic-Protocol-Handler上代码示例的详细文章。
安舒尔梅拉
自定义URL可以调用dos批处理文件或vbscript来解析参数,然后调用winmerge。
我有类似的要求,我需要从浏览器应用程序与桌面客户端进行通信。我采用的方法是Java Applet的方法。
很快我就遇到了你提到的完全相同的问题,即出于安全原因的“访问控制例外”。处理这个问题的正确方法是签署一个小程序,你很高兴。这些是我签署我的applet的步骤,
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
是的,您可以通过这种方式传递参数在html代码中执行此操作
"<a href='alert:"Hello World"'>this link</a>"
这将生成html为
<a href="alert:"Hello World"">this link</a>
它将传递你的exe两个参数,即“alert:Hello”和“World”。我仍在搜索如何在不进行任何解析的情况下将第一个参数设置为“Hello”。
首先,我将介绍要求。
然后我将向您展示如何满足每个要求
要求:
- 创建一个小型命令行应用程序,它将目标应用程序路径作为参数并在“?”之后将为目标应用程序提供参数。
- 创建包含自定义URL注册表信息的.reg文件。
- 使用自定义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
E.编译程序并在本地测试之后,将其放在中央位置,最好放在每个人都可以访问的网络驱动器上。 2.创建包含以下代码的.reg文件: 码:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOTmylauncher]
"URL Protocol"=""""
@=""URL: mylauncher Protocol""
[HKEY_CLASSES_ROOTmylaunchershell]
[HKEY_CLASSES_ROOTmylaunchershellopen]
[HKEY_CLASSES_ROOTmylaunchershellopenCommand]
;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.通过sysadmin中央发行版分发reg密钥,或在每台PC上启动.reg文件。 B.用法: mylauncher:AppYouWantToLaunchPathGoesHere ArgumentsGoHere
- 在您的网页上创建超链接:
码:
<!doctype html> <html> <head> </head> <body> <div class="test-container"> <a href='mylauncher:C:Program FilesIBMClient AccessEmulatorpcsfe.exe?U=MyUserName' >TEST</a> </div> </body> </html>
如果某些东西不起作用,写信给我。我会帮你的。 祝你好运。
以上是关于协议处理程序的主要内容,如果未能解决你的问题,请参考以下文章
是否有在单个活动中处理多个片段的 Android 设计模式?