none
Aufruf Fremd-Exe RRS feed

  • Frage

  • Hallo

    Ist es in einer für x86 kompilierten Net-Anwendung (Jet!) grundsätzlich
    möglich, auf einem Windows 7 64-Bit-Rechner eine Fremd-Exe (in 32- oder
    64-Bit Version), synchron oder asynchron aufzurufen?

    Konkret: Aufruf der FFmpeg.exe (http://ffmpeg.org/ffmpeg.html).
    Auf XP Sp3 (32-Bit) funktioniert die .exe (32-Bit, Juni-Release) mit
    synchronem wie mit asynchronem Aufruf bestens.

    Danke und Gruß

    Josef Morlo

    Sonntag, 15. Juli 2012 16:21

Antworten

  • Ich habe mal folgenden Cod getestet:

    Dim psi As New ProcessStartInfo()
    psi.FileName = "test64.exe"
    psi.Arguments = "MyParam"
    psi.RedirectStandardError = True
    Dim p As New Process()
    p.StartInfo = psi
    p.Start()
    Dim Code As Integer = p.ExitCode

    Dieser hat als 32 Bit kompiliert unter x64 Windows 7 mit der Anwendung test64.exe im Debug-Verzeichnis (x64) auch funktioniert. Ich konnte entsprechend "MyParam" in den Startparametern auslesen. Nach der beendigung der test64.exe bekam ich meine eingegebene Zahl zurückgeliefert.

    Diesen Code muss die Main-Methode als Rückgabewert haben. Den Stream müsstest du natürlich auch auslesen können, habe ich jetzt aber nicht getestet.

    Was Jet ist, wusste ich bis heute nicht, ich habe das Problem mit der Skype4COM API, die auch einen Zugriff aus einer 32 Bit Assembly benötigt. Ich löste das Problem mit den Rückgabecodes etc.


    Koopakiller - http://koopakiller.ko.ohost.de/

    • Als Antwort markiert Josef Morlo Montag, 16. Juli 2012 12:01
    Montag, 16. Juli 2012 11:12
    Moderator

Alle Antworten

  • Hallo,

    wenn du mit starten den Aufruf der EXE über die Klasse Process meinst, so funktioniert das.
    Allerdings eine 64Bit Assembly in einem 32Bit Programm zu referenzieren geht leider nicht (musste leider selbst die Erfahrung machen).

    Was genau bedeutet "(Jet!)" ?


    Koopakiller - http://koopakiller.ko.ohost.de/

    Sonntag, 15. Juli 2012 16:39
    Moderator

  • Hallo,
    und zunächst mal danke für deine Antwort

    Koopakiller schrieb:

    wenn du mit starten den Aufruf der EXE über die Klasse Process <http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx> meinst, so funktioniert das.

    genau, das hab ich gemeint.

    Vielleicht kannst Du mir auch sagen, ob der Aufruf der Fremd-Exe auch mit
    Parameter-Übergaben einschließlich Rückgaben funktioniert, also von
    x86-Kompilat zu 64-Bit-Rechner und zurück. Also etwa des Typs (gekürzt):

    'Parametrisierte Übergabe
    Dim cmd As String = _
       "-i " & _
       <Pfad1> & " " & _
       VideoCodecCopy & " " & _
       AudioCodecCopy & " " & _
       "<Double1> " & _
       "<Double2> " & _
       "-t " & _
       "<Double3>" & " " & _
       "-y " & <Pfad2> [...]

    Sub StartProcess(ByVal cmd As Object)
    [...]
       Dim psi As New    System.Diagnostics.ProcessStartInfo
       psi.FileName = <Pfad zur Exe>
       psi.Arguments = cmd.ToString
       psi.RedirectStandardError = True
       Dim proc As New System.Diagnostics.Process()
       proc.StartInfo = psi
       proc.Start()

       'Rückgabe an Formobjekt
       Dim result As String = proc.StandardError.ReadToEnd()
       [...]
       If TextBox1.InvokeRequired Then
          Dim d As New SetTextDel(AddressOf SetText)
          TextBox1.Parent.Invoke(d, New Object() {result})
       Else
          TextBox1.Text = result
       End If
    End Sub

    Was genau bedeutet "(Jet!)" ?

    Mit ‚Jet’ ist die windowseigene Datenbank (.mdb) gemeint
    (http://de.wikipedia.org/wiki/Microsoft_Jet_Engine). Dafür muss ich nämlich
    ausdrücklich für x86 kompilieren. Ansonsten wär’s ja kein Problem.

    Danke und Gruß

    Josef Morlo

    Montag, 16. Juli 2012 08:35
  • Ich habe mal folgenden Cod getestet:

    Dim psi As New ProcessStartInfo()
    psi.FileName = "test64.exe"
    psi.Arguments = "MyParam"
    psi.RedirectStandardError = True
    Dim p As New Process()
    p.StartInfo = psi
    p.Start()
    Dim Code As Integer = p.ExitCode

    Dieser hat als 32 Bit kompiliert unter x64 Windows 7 mit der Anwendung test64.exe im Debug-Verzeichnis (x64) auch funktioniert. Ich konnte entsprechend "MyParam" in den Startparametern auslesen. Nach der beendigung der test64.exe bekam ich meine eingegebene Zahl zurückgeliefert.

    Diesen Code muss die Main-Methode als Rückgabewert haben. Den Stream müsstest du natürlich auch auslesen können, habe ich jetzt aber nicht getestet.

    Was Jet ist, wusste ich bis heute nicht, ich habe das Problem mit der Skype4COM API, die auch einen Zugriff aus einer 32 Bit Assembly benötigt. Ich löste das Problem mit den Rückgabecodes etc.


    Koopakiller - http://koopakiller.ko.ohost.de/

    • Als Antwort markiert Josef Morlo Montag, 16. Juli 2012 12:01
    Montag, 16. Juli 2012 11:12
    Moderator
  • Hallo,
    Koopakiller schrieb:

    Ich habe mal folgenden Cod getestet:

    [...]

    Dieser hat als 32 Bit kompiliert unter x64 Windows 7 mit der Anwendung test64.exe im Debug-Verzeichnis (x64) auch funktioniert. Ich konnte entsprechend "MyParam" in den Startparametern auslesen. Nach der beendigung der test64.exe bekam ich meine eingegebene Zahl zurückgeliefert.

    Das hört sich sehr erfreulich für mich an :-) Dann ist ja der
    eingeschlagene Weg nicht ganz so falsch :-)

    Vielen Dank für Deine Mühe mit dem Testcode und die kompetente Anwort

    Gruß Josef Morlo

    Montag, 16. Juli 2012 12:08