要求:我们希望通过按钮或链接从网页启动外部比较工具(如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),后者可以理解它们。这些比较工具没有可以从协议传递的参数。
我们还有其他方法可以满足这一要求吗?
谢谢, 阿都
答案 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)
首先,我将介绍要求。
然后我将向您展示如何满足每个要求
要求:
让我们开始吧:
代码:
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
在您的网页上创建超链接:
代码:
<!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>
如果某些东西不起作用,写信给我。我会帮你的。
祝你好运。