协议处理程序

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”。

另一答案

首先,我将介绍要求。

然后我将向您展示如何满足每个要求

要求:

  1. 创建一个小型命令行应用程序,它将目标应用程序路径作为参数并在“?”之后将为目标应用程序提供参数。
  2. 创建包含自定义URL注册表信息的.reg文件。
  3. 使用自定义URL为您的网页上的应用程序创建链接。

让我们开始吧:

  1. 创建命令行应用程序:步骤: 打开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

  1. 在您的网页上创建超链接: 码: <!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> 如果某些东西不起作用,写信给我。我会帮你的。 祝你好运。

以上是关于协议处理程序的主要内容,如果未能解决你的问题,请参考以下文章

python+spark程序代码片段

是否有在单个活动中处理多个片段的 Android 设计模式?

异常和TCP通讯

CPNtools协议建模安全分析---实例变迁标记

Android - 应用程序启动时片段 onCreate 崩溃

Android 应用程序片段不断崩溃