| 

.NET C# Java Javascript Exception

5
Hallo Zusammen,

Das wird jetzt etwas knifflig:

Man kennt ja den Aufruf einer Datei über das Internet ("http://meinserver.de/meinedatei.doc").
Ich brauche etwas ähnliches über ein eigene Url die mir dynamich anhand des Aufrufs eine Datei zurückgibt.

Man kann einen eigenen Url Handler im Windows erstellen:

[HKEY_CLASSES_ROOT\myhandler]
@="URL:myhandler Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\myhandler\shell]

[HKEY_CLASSES_ROOT\myhandler\shell\open]

[HKEY_CLASSES_ROOT\myhandler\shell\open\command]
@="myhandler.exe %1"

Wenn man jetzt den Handler im Browser aufruft ("myhandler://1234") wird auch die Datei myhandler.exe aufgerufen und mann kann dort im Code irgendwas machen.
Ich muss mit dem Ding einen Dateipfad zurückgeben, der im Code automatisch ermittelt/generiert wird. Also soll es genau das machen, nur mit meiner Logik wie oben in dem http Beispiel.

Wozu das Ganze:

Im Word kann man unter Einfügen -> Schnellbausteine -> Felder -> IncludeText eine Url angeben. genau diese Url soll meinen Handler (myhandler) benutzen, meine myhandler.exe aufrufen und Word, ähnlich wie das unter http ist die Datei zurückgeben (in der Form c:\meineDatei.doc).

Was ich habe:
- den Handler
- ich kann mir den Dateipfad organisieren

Was fehlt:
- mir ist nicht klar wie ich einen String als Rückgabewert im VB.NET ausgeben kann
- braucht Word als Antwort überhaupt einen String oder einen FileStream

Wäre für eure Hilfe sehr dankbar,

Daniel
News:
20.12.2012
schlumpfger 288 1 8
2 Antworten
2
Das wird sogar noch kniffliger, als Du denkst...

So wie Du Dir das vorstellst, wird es nicht funktionieren. Über die Custom URL Protocol Handler kannst Du in Windows mit Anwendungen mit bestimmten Protokollen verknüpfen, die dann beim Aufruf einer entsprechenden URL (z.B. über das Ausführen-Feld im Startmenü oder in .NET über System.Process.Start(url)) gestartet werden. Das ist aber nicht mit einem Funktionsaufruf zu verwechseln - wie Karl schon geschrieben hat, bekommst Du da nichts zurück außer einer Indikation, ob die verknüpfte Anwendung gestartet wurde.

Word verwendet diesen Mechanismus für http(s)-URLs mit ziemlicher Sicherheit an dieser Stelle nicht - sonst würde nämlich einfach nur der Default-Browser aufgehen und die angegebene Seite öffnen.

Solange Du die Jungs und Mädels in Redmond also nicht davon überzeugen kannst, Dein Protokoll zu unterstützen ;-) , wirst Du wohl über http gehen müssen. Ein minimaler Webserver, der eine Datei ausliefern kann, ist in .NET ja schnell gebaut (Stichwort: WebGetAttribute). Knifflig ist die Frage, wo der dann laufen soll. Mir fallen zwei Möglichkeiten ein:

  • als Windows-Service
  • innerhalb eines Word-Addins. Das hab ich selbst schon mal gemacht, es funktioniert wirklich. Du mußt nur aufpassen, daß Du bei der Installation des Addins den Port + Pfad freischaltest (Namespace-Reservation oder so ähnlich heißt das, glaube ich - hat nichts mit C#-Namespaces zu tun), und daß Du einen Mechanismus implementierst, der dafür sorgt, daß bei mehreren laufenden Word-Instanzen nur jeweils eine das Addin startet - sonst streiten die sich nämlich um die Zuständigkeit für die Adresse.


Viel Erfolg!
21.12.2012
Matthias Hlawatsch 13,2k 4 9
0
Hallo schlumpfger,

du kannst keine String als Rückgabewert verwenden, denn das Betriebssystem erwartet einen Long Wert als Exitcode. Dabei besagt in der Regel, das ein Exitcode ungleich Null ein Fehler ist. In Batch Dateien kannst du den Exitcode mit der Variable %ERRORLEVEL% abfragen.

Mein Lösungsvorschlag wäre: Wenn du den Pfad zu der Datei kennst, wieso verwendest du einen eigenen Handler? Nimm doch einfach "file://<Pfad zu deiner Datei>"

Gruß Karl
20.12.2012
Karl 958 8
Den Pfad der Datei kann ich erst in der myhandler. exe anHand der der aufgerufenen URL ("myhandler://1234") ermitteln. Der Pfad und Name der Datei ändert sich bei jedem Aufruf.
schlumpfger 20.12.2012
OK. Wie wäre es mit einem eigenen Webdienst? http://<meinserver>/GetFile....
Was du eventuell auch noch mal probieren könntest wäre auf den StdIn zu schreiben:
Dim sw As System.IO.StreamWriter = System.Diagnostics.Process.GetCurrentProcess.StandardInput
sw.WriteLine("Pfad zur Datei")

Ist natürlich ungetestet.
Karl 21.12.2012

Stelle deine .net-Frage jetzt!