要求:我们希望通过按钮或链接从网页启动外部比较工具(如BeyondCompare或WinMerge)。文本文件路径应该在工具启动时传递给它,这样它就可以理解它们,并在左侧和右侧的比较面板中打开它们。
尝试过的解决方案:
1) 使用JavaScript的ActiveXObject:有了这个,用户只需点击一个按钮/链接,就可以启动安装在其机器上的比较工具。但它只能在Internet Explorer中使用,所以我们不能使用它。
参考:如何使用超链接运行外部程序,例如记事本?
2) 使用Java小程序:由于安全原因,嵌入浏览器中的小程序不允许访问本地文件系统,并且会引发"访问控制异常"。因此,我们也不能这样做。
参考:为什么我的小程序抛出AccessControlException?
3) 使用协议处理程序:我们可以设置一个自定义URL协议来触发程序。就像我们如何将邮件发送到: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"one_answers"subject"参数传递给邮件客户端(如Outlook),后者可以理解它们。这些比较工具没有可以从协议传递的参数。
有没有其他方法可以满足这一要求?
谢谢,Abdul
最近创造了另一种方法来执行同样的操作。基本上,这种新方法依赖于创建一个Handler应用程序,它只是一个基于Windows控制台的ClickOnce应用程序。ClickOnce Handler应用程序将充当Host(网页或outlook或任何可以嵌入链接的东西)和Target应用程序(如WinMerge或Beyond Compare)之间的拦截器。单击主机应用程序中的嵌入链接时,将调用Handler应用程序。Link只是一个http url,它将在querystring参数中保存信息。由于处理程序应用程序是ClickOnce部署的,因此它允许将自己发布到Web服务器。嵌入链接(HTTPURL)将调用处理程序应用程序,然后处理程序应用将解析接收到的查询字符串参数,并最终调用相关的目标应用程序。处理程序应用程序可以被认为是一个Click Once Deployed解析器应用程序。以下是Custom-HyperLinks-Using-a-Generic-Protocol-Handler上的详细文章和代码示例。
Anshul Mehra
自定义url可以调用dos批处理文件或vbscript,后者解析参数,然后调用winmerge。
我有一个类似的需求,需要通过浏览器应用程序与桌面客户端进行通信。我采用的方法是Java Applet。
很快,我就遇到了与您提到的完全相同的问题,即由于安全原因导致的"访问控制异常"。处理此问题的正确方法是SIGN一个小程序,您就可以使用了。以下是我签署我的小程序的步骤
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"one_answers"World"。我仍在寻找如何在不进行任何解析的情况下使第一个参数仅为"Hello"。
首先我将介绍需求。
然后我将向您展示如何满足的每一项要求
要求:
- 创建一个小型命令行应用程序,该应用程序将以目标应用程序路径为参数,在"?"之后将为目标应用程序获取参数
- 创建一个包含自定义URL注册表信息的.reg文件
- 使用自定义URL在网页上为应用程序创建链接
让我们开始:
- 创建命令行应用程序:步骤:
- 打开Microsoft Visual Studio并选择使用Visual Basic模板创建新的控制台应用程序。我们称之为"MyLauncher">
- 在项目属性>>应用程序中将目标框架版本设置为。NET 2.0,以确保任何人都能使用此应用程序。C.添加对项目-系统的引用。Windows。表格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密钥,或在每台电脑上启动.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>
如果有问题,请写信给我。我会帮你的
祝你好运,朋友。