协议处理程序

时间:2012-09-18 06:50:00

标签: launching-application protocol-handler

要求:我们希望通过按钮或链接从网页启动外部比较工具(如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”协议不同,后者将“body”和“subject”参数传递给邮件客户端(如Outlook),后者可以理解它们。这些比较工具没有可以从协议传递的参数。

我们还有其他方法可以满足这一要求吗?

谢谢, 阿都

5 个答案:

答案 0 :(得分:2)

最近又创造了另一种方法来实现同样的目标。基本上这种新方法继续创建一个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的代码示例的详细文章。

Anshul Mehra

答案 1 :(得分:1)

自定义网址可以调用dos批处理文件或vbscript来解析参数,然后调用winmerge。

答案 2 :(得分:0)

我有一个类似的要求,我需要从浏览器应用程序与桌面客户端进行通信。我采用的方法是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

答案 3 :(得分:0)

是的,您可以通过这种方式传递参数 在HTML代码中执行此操作

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

这将生成html为

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

它将传递你的exe两个参数,即&#34;警告:你好&#34;和&#34;世界&#34;。 我仍然在寻找如何制作第一个参数&#34; Hello&#34;没有做任何解析。

答案 4 :(得分:0)

首先,我将介绍要求。

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

要求:

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

    1. 创建命令行应用程序: 脚步:
      1. 打开Microsoft Visual Studio并选择使用Visual Basic模板创建新的控制台应用程序。我们称之为“MyLauncher”。
      2. 在项目属性&gt;&gt;应用程序将目标框架版本设置为.NET 2.0,以确保任何人都能够使用此应用程序。 C.添加对项目的引用 - System.Windows.Forms D.将Module1.vb文件中的所有默认代码覆盖为以下内容:
    2. 代码:

       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\""
      

      一个。通过sysadmin中央分发分发reg密钥或在每台PC上启动.reg文件 B.用法:
      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>
        


        如果某些东西不起作用,写信给我。我会帮你的。
        祝你好运。