| 

.NET C# Java Javascript Exception

2
Ich möchte gern installierte Windows Anwendungen wie Office Word oder den Acrobat Reader aus meiner eigenen Anwendung starten und gleichzeitig per "Stream" Object Texte oder Daten übergeben. Wie kann man das lösen?
Die Anwendung ist komplett in C# geschrieben. Hintergrund ist, dass aus einer objektorientierten Datenbank (Db4o) von einem Server sogenannte "Blob" Daten (Binary Large Objects) gelesen werden. Diese werden lokal in einer temporären Datei im Temp Verzeichnis abgelegt. Zusätzlich sind die Blobs eingebettet in ein Objekt wo noch einige Fields gehalten werden, die das Blob mit einigen Eigenschaften versehen (Label = Filename und Type = z.B. pdf). Also Ziel ist Blobs (Dateien) vom Server zu holen und direkt mit der registrierten Anwendung (erkennbar and den mitgelieferten Attributen) auf dem lokalen Rechner zu starten.
07.06.2011
es243040 69 1 2
5
In welcher Umgebung programmierst Du? .NET, oder mit C/C++ direkt gegen die Windows-API, oder Java, oder...?
Matthias Hlawatsch 07.06.2011
Programmiere unter Visual Studio und .Net 4.0 mit C#
es243040 08.06.2011
5 Antworten
2
Ich habe dass in VB.NEt wie folgt gelöst und bin damit total zufrieden:

<DllImport("kernel32.dll")> _
Private Shared Function GetTempPath(ByVal nBufferLength As UInteger, <Out()> ByVal lpBuffer As StringBuilder) As UInteger
End Function

<DllImport("shell32.dll", EntryPoint:="FindExecutable")> _
Private Shared Function FindExecutableA(ByVal lpFile As String, ByVal lpDirectory As String, <Out()> ByVal lpResult As StringBuilder) As Long
End Function

''' <summary>
''' Startet die Anwendung, die für die angegebene Datei registriert wurde
''' </summary>
''' <param name="FileName"></param>
''' <remarks></remarks>
Public Shared Sub OpenFilesWithHostApplication(ByVal FileName As String)
Dim pInfo As New ProcessStartInfo
Dim pProcess As Process
Dim _FI As FileInfo
Dim _PathToApplication As String
Dim _FileExtension As String

' Ermitteln der Dateiendung
_FI = New FileInfo(FileName)
_FileExtension = _FI.Extension

' Das verknüpfte Prgramm ermitteln
_PathToApplication = GetPathFileExtention(_FileExtension)

' Öffnen der Anwendung mit Übergabe des Dateinamens
With pInfo
If InStr(FileName, "\", CompareMethod.Text) > 0 Then
.Arguments = FileName
Else
.Arguments = String.Format("{0}", FileName)
End If

.FileName = _PathToApplication
.WindowStyle = ProcessWindowStyle.Normal
.CreateNoWindow = True
End With

pProcess = Process.Start(pInfo)
With pProcess
.WaitForInputIdle()
'.WaitForExit()
End With
End Sub
07.06.2011
MyKey0815 1,6k 2 9
Von .Net war aber nirgendwo die Rede ;)
Floyd 07.06.2011
Scheint mir zu kompliziert. Ich möchte die .Net Welt nicht verlassen.
es243040 08.06.2011
2
Wäre das mit ShellExecute nicht etwas einfacher?
07.06.2011
nabuchodonossor 1,3k 5
Scheint mir zu kompliziert. Ich möchte die .Net Welt nicht verlassen.
es243040 08.06.2011
siehe dort: http://dotnet-snippets.de/dns/shellexecute-SID1000.aspx


einfacher geht es wirklich nur mehr mit Process.Start, wie einige schon sagten. Aber kompliziert ist ShellExecute absolut nicht.
nabuchodonossor 09.06.2011
2
Und wäre es mit System.Diagnostics.Process.Start() nicht noch etwas einfacher?

Zum Beispiel

Process.Start("file.pdf"); //öffnet file.pdf in der Anwendung, die für *.pdf registriert ist
Process.Start("file.docx"); //öffnet file.docx in der Anwendung, die für *.docx registriert ist


Falls es für dich wichtig ist, dass die Datei direkt gestreamt wird, statt sie zuvor auf die Platte zu schreiben, hilft Dir das aber noch nicht. Letztlich muss das auch die Anwendung unterstützen. Beim Acrobat könnte ich mir das vorstellen, bei Word wäre ich mir schon nicht mehr so sicher. Was ich versuchen würde: mach Deine Anwendung zu einem lokalen Webserver (der die Dateien streamt), und öffne dann Deine Anwendungen mit

Process.Start("http://localhost:8080/file.pdf"); //öffnet file.pdf über den Default-Browser
Process.Start("http://localhost:8080/file.docx"); //öffnet file.docx über den Default-Browser


Möglicherweise mußt Du in der HTTP-Response noch ein paar Header passend setzen, damit das Streamen funktioniert. Da muss ich mit Details aber passen.
07.06.2011
Matthias Hlawatsch 13,2k 4 9
Von .Net war aber nirgendwo die Rede ;)
Floyd 07.06.2011
Aber auch von nichts anderem konkreten ;-)
Ehrlich gesagt hab ich die Tags nicht genau gelesen und bin durch die (zeitlich) erste Antwort von MyKey0815 "ganz automatisch" auf .NET gekommen. Mal sehen, ob der Fragesteller uns noch genauere Hinweise gibt (siehe mein Kommentar zur Frage).
Matthias Hlawatsch 07.06.2011
"Winapi, Windows, API" sind ein deutliches Zeichen dafür das er eine Lösung mit der Windows-API sucht. ;)
Floyd 07.06.2011
Ich glaube, "Process.Start()" könnte hier helfen...
Werde ich mir mal anschauen. Danke schon mal für den Hinweis.
es243040 08.06.2011
2
Mein Ansatz wäre folgender. Zuerst ermittelst du anhand der Erweiterung um welches Programm es sich handelt, dazu kannst du mein Snippet nutzen.

Aufgrund dessen rufst du dann mittels Process.Start das Programm mit dem Parameter auf:
public void StartProgram(string program, string parameter)
{
System.Diagnostics.Process.Start(program, parameter);
}
07.06.2011
Konstantin 3,7k 8
1
Vielleicht stehe ich ja auf der Leitung, aber das, was Dein Snippet macht, erledigt Windows doch automatisch, wenn man Process.Start(parameter) aufruft, oder? (Ich gehe davon aus, dass "parameter" in Deinem Beipiel der Dateiname ist.)
Matthias Hlawatsch 07.06.2011
Ja eigentlich schon, aber der eigentliche Grund, warum das Snippet entstanden ist, ist der folgende, das bei mir (Windows XP) Windows total lange braucht, wenn ich nur sage: Process.Start("Datei.xls"). Führe ich die arbeit manuell aus, rennt es :-)
Konstantin 07.06.2011
Ja eigentlich schon, aber der eigentliche Grund, warum das Snippet entstanden ist, ist der folgende, das bei mir (Windows XP) Windows total lange braucht, wenn ich nur sage: Process.Start("Datei.xls"). Führe ich die arbeit manuell aus, rennt es :-)
Konstantin 07.06.2011
Von .Net war aber nirgendwo die Rede ;)
Floyd 07.06.2011
Hab ich mich wohl bei den Tags verlesen :-/
Konstantin 07.06.2011
0
Sorry, dass die .Net Tags fehlten...
Ich möchte gern die direkte WIN API vermeiden und in .Net bleiben. Wusste aber nicht wo ich starten sollte. Ich habe entsprechend Informationen in der Frage ergänzt.
08.06.2011
es243040 69 1 2

Stelle deine .net-Frage jetzt!