6 Stimmen

Protokollabwickler

Anforderung : Wir wollen ein externes Vergleichstool (wie BeyondCompare oder WinMerge) von einer Webseite aus über eine Schaltfläche oder einen Link starten. Die Pfade zu den Textdateien sollen beim Start an das Tool übergeben werden, damit es sie versteht und sie in den linken und rechten Vergleichsfenstern öffnet.

Erprobte Lösungen :

1) Verwendung Das ActiveXObject von JavaScript : Damit kann der Benutzer einfach auf eine Schaltfläche/einen Link klicken und das auf seinem Rechner installierte Vergleichstool starten. Es funktioniert jedoch nur im Internet Explorer, so dass wir dies nicht verwenden können.

Ref: Wie kann man ein externes Programm, z. B. Notepad, über einen Hyperlink aufrufen?

2) Verwendung Java-Applet : Aus Sicherheitsgründen dürfen in einen Browser eingebettete Applets nicht auf das lokale Dateisystem zugreifen und lösen eine "Access Control Exception" aus. Daher können wir dies auch nicht tun.

Ref: Warum löst mein Applet eine AccessControlException aus?

3) Verwendung Protokoll-Handler : Wir können ein benutzerdefiniertes URL-Protokoll einrichten, um das Programm auszulösen. Ähnlich wie bei der mailto:user@email.com-Syntax zur Erstellung von E-Mail-Links wird damit automatisch Outlook unter Windows gestartet. "mailto" ist ein vordefiniertes Protokoll in der Windows-Registrierung.

In ähnlicher Weise haben wir unser eigenes Protokoll, z.B. "launchCompareTool" in der Registry erstellt und konnten damit jede Anwendung wie WinMerge oder BeyondCompare starten. Wir sind jedoch nicht in der Lage, die Dateipfade auf der linken und rechten Seite als Argumente an die Anwendung zu übergeben. Möglicherweise muss die Anwendung, die gestartet wird, diese Argumente erwarten.

Ref: 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

Im Gegensatz zum "mailto"-Protokoll, bei dem die Argumente "body" und "subject" an den E-Mail-Client (z. B. Outlook) weitergegeben werden, der sie versteht. Diese Vergleichstools haben keine solchen Argumente, die vom Protokoll übergeben werden können.

Gibt es eine andere Möglichkeit, diese Anforderung zu erfüllen?

Danke, Abdul

2voto

Anshul Mehra Punkte 21

Ein weiterer Ansatz, der vor kurzem entwickelt wurde, um das Gleiche zu tun. Im Grunde beruht dieser neue Ansatz auf der Erstellung einer Handler-Anwendung, die nichts anderes als eine auf der Windows-Konsole basierende ClickOnce-Anwendung ist. Die ClickOnce-Handler-Anwendung fungiert als Abfangjäger zwischen dem Host (eine Webseite oder Outlook oder irgendetwas, das den Link einbetten kann) und der Zielanwendung (wie WinMerge oder Beyond Compare). Die Handler-Anwendung wird beim Klick auf den eingebetteten Link in der Host-Anwendung aufgerufen. Der Link ist nichts anderes als eine http-URL, die die Informationen im Querystring-Parameter enthält. Da die Handler-Anwendung über ClickOnce bereitgestellt wird, kann sie selbst auf einem Webserver veröffentlicht werden. Der eingebettete Link (HTTP-URL) ruft die Handler-Anwendung auf, die dann die empfangenen Query-String-Parameter parst und schließlich die entsprechende Zielanwendung aufruft. Die Handler-Anwendung kann als eine Click Once Deployed Parser-Anwendung betrachtet werden. Nachfolgend finden Sie den ausführlichen Artikel mit Codebeispiel unter Benutzerdefinierte Hyperlinks unter Verwendung eines generischen Protokoll-Handlers .

Anshul Mehra

1voto

Brian McGinity Punkte 5519

Die benutzerdefinierte URL kann eine Dos-Batch-Datei oder ein Vbscript aufrufen, das die Argumente analysiert und dann winmerge aufruft.

0voto

anudroid Punkte 163

Ich hatte eine ähnliche Anforderung, bei der ich mit einem Desktop-Client von einer Browser-App aus kommunizieren musste. Der Ansatz, den ich verfolgte, war der eines Java-Applets.

Schon bald stand ich vor genau demselben Problem, das Sie erwähnt haben, nämlich der "Access control exception" aus Sicherheitsgründen. Der richtige Weg, dies zu behandeln, wäre SIGN ein Applet und Sie sind startklar. Dies sind die Schritte, die ich unternommen habe, um das Applet von mir zu signieren,

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

0voto

Fahad Malik Punkte 685

Ja, Sie können die Parameter auf diese Weise übergeben Im HTML-Code tun Sie dies

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

Dies erzeugt html als

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

Es wird Ihre Exe zwei Parameter übergeben, nämlich "alert:Hello" und "World". Ich bin immer noch auf der Suche, wie man den ersten Parameter nur "Hello" machen kann, ohne ein Parsing durchzuführen.

0voto

Adi Solar Punkte 127

Zunächst werde ich die Anforderungen darlegen.

Dann werde ich Ihnen zeigen, wie Sie die einzelnen Anforderungen erfüllen können

Anforderungen:

  1. Erstellen Sie eine kleine Kommandozeilenanwendung, die den Pfad der Zielanwendung als Parameter annimmt und nach "?" Argumente für die Zielanwendung entgegennimmt.
  2. Erstellen Sie eine .reg-Datei mit den Registrierungsinformationen für die benutzerdefinierte URL.
  3. Erstellen Sie einen Link für eine Anwendung auf Ihrer Webseite mit der benutzerdefinierten URL.

Fangen wir an:

  1. Erstellen der Kommandozeilenanwendung: Schritte:
    1. Öffnen Sie Microsoft Visual Studio und wählen Sie die Option zum Erstellen einer neuen Konsolenanwendung mit Visual Basic-Vorlage. Wir werden sie "MyLauncher" nennen.
    2. Setzen Sie in den Projekteigenschaften >> Anwendung die Ziel-Framework-Version auf .NET 2.0, um sicherzustellen, dass jeder diese Anwendung verwenden kann. C. Fügen Sie eine Referenz zum Projekt hinzu - System.Windows.Forms D. Überschreiben Sie den gesamten Standardcode in der Datei Module1.vb wie folgt:

Code:

 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. Kompilieren Sie das Programm, und nachdem Sie es lokal getestet haben, legen Sie es an einem zentralen Ort ab, vorzugsweise auf einem Netzlaufwerk, auf das jeder Zugriff hat.

2. Erstellen Sie eine .reg-Datei, die den folgenden Code enthält:
Code:

      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. Verteilen Sie den reg-Schlüssel über Ihre zentrale Sysadmin-Verteilung oder starten Sie die .reg-Datei auf jedem PC.
B. Verwendung:
mylauncher:AppYouWantToLaunchPathGoesHere?ArgumentsGoHere

  1. Erstellen Sie einen Hyperlink auf Ihrer Webseite:
    Code:

     <!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>

    Schreiben Sie mir, wenn etwas nicht funktioniert. Ich werde dir helfen.
    Viel Glück, mein Freund.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X