6

要求:我们希望通过按钮或链接从网页启动外部比较工具(如 BeyondCompare 或 WinMerge)。文本文件路径应在启动时传递给该工具,以便它理解它们并在左侧和右侧比较面板中打开它们。

尝试过的解决方案

1) 使用JavaScript 的 ActiveXObject:用户可以简单地点击一个按钮/链接并启动安装在其机器上的比较工具。但它只适用于 Internet Explorer,所以我们不能这样做。

参考:如何使用超链接运行外部程序,例如记事本?

2) 使用Java Applet:出于安全原因,浏览器内嵌的小程序不允许访问本地文件系统,会抛出“访问控制异常”。因此,我们也不能这样做。

参考:为什么我的小程序会抛出 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)。这些比较工具没有可以从协议传递的参数。

有没有其他方法可以满足这个要求?

谢谢, 阿卜杜勒

4

5 回答 5

2

最近创造了另一种方法来执行相同的操作。基本上,这种新方法依赖于创建一个 Handler 应用程序,它只不过是一个基于 Windows 控制台的 ClickOnce 应用程序。ClickOnce 处理程序应用程序将充当主机(网页或 Outlook 或任何可以嵌入链接的东西)和目标应用程序(如 WinMerge 或 Beyond Compare)之间的拦截器。处理程序应用程序将在单击主机应用程序中的嵌入链接时被调用。链接只不过是一个 http url,它将保存查询字符串参数中的信息。由于处理程序应用程序是 ClickOnce 部署的,因此它允许将自己发布到 Web 服务器。嵌入链接(HTTP URL)将调用处理程序应用程序,然后处理程序应用程序将解析接收到的查询字符串参数,最后调用相关的目标应用程序。可以将处理程序应用程序视为 Click Once Deployed 解析器应用程序。以下是带有代码示例的详细文章Custom-HyperLinks-Using-a-Generic-Protocol-Handler

安舒尔·梅赫拉

于 2013-02-16T14:45:56.067 回答
1

自定义 url 可以调用解析参数然后调用 winmerge 的 dos 批处理文件或 vbscript。

于 2013-10-18T03:08:02.237 回答
0

我有一个类似的要求,我需要从浏览器应用程序与桌面客户端进行通信。我采用的方法是 Java 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
于 2013-04-18T15:21:13.890 回答
0

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

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

这将生成html为

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

它将传递您的 exe 两个参数,即“alert:Hello”和“World”。我仍在寻找如何在不进行任何解析的情况下仅制作第一个参数“Hello”。

于 2015-04-24T07:32:25.797 回答
0

首先,我将介绍要求。

然后我会告诉你如何满足每一个要求

要求:

  1. 创建一个小型命令行应用程序,它将目标应用程序路径作为参数并在“?”之后 将为目标应用程序接受参数。
  2. 创建一个包含自定义 URL 注册表信息的 .reg 文件。
  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

E. 编译程序并在本地测试后,将其放在中央位置,最好放在每个人都可以访问的网络驱动器上。

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 密钥或在每台 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>
    


    如果有什么不起作用,请写信给我。我会帮你的。
    祝朋友好运。

于 2016-12-01T14:30:54.807 回答