Frage

Ich interessiere mich für Aufruf SoX , eine Open-Source-Konsolenanwendung, von einem anderen Windows-GUI-Programm ( in Delphi geschrieben natürlich). Anstatt sich mit Kratzen und das Konsolenfenster versteckt, würde Ich mag nur die Anwendung auf eine DLL konvertieren, die ich aus meiner Anwendung aufrufen können.

Bevor ich diesen Weg beginnen nach unten Ich bin gespannt, wie viel Arbeit ich sollte für sein erwarten? Sprechen wir ein großes Unternehmen, oder gibt es eine gerade nach vorne Lösung? Ich weiß, dass einige C, aber ich bin keineswegs ein Experte bedeutet.

Ich bin SoX spezifische Details nicht erwartet, nur EXE-Konsolenanwendung Umwandlung allgemein DLL. Wenn jemand kennt SoX aber noch besser.

War es hilfreich?

Lösung

Für das spezielle Thema einer Konsole ausführbar in eine Bibliothek des Drehens durch den C-Quellcode zu modifizieren, es hängt davon ab, wie die Befehlszeilenanwendung berücksichtigt wird. Wenn es in einer solchen Art und Weise geschrieben, die I / O durch einen kleinen Satz von Funktionen oder sogar bessere Funktionszeiger geschleust wird, dann offensichtlich wird es trivial sein.

Wenn es mit printf, scanf und Freunde getan hat, dann werden Sie wahrscheinlich am besten dran, indem du / Erstellung einer Include-Datei, die alle Quelldateien enthalten und das Hinzufügen von ein Makro, das printf / scanf und Freunde zu Ihrer eigenen Funktionen umleitet die geschrieben werden, um DLL-Implementierung zugänglich zu sein. Dinge wie printf aus vsnprintf (verwenden Sie die n-Version für Sicherheit) gebaut werden, so dass Sie das ganze C RTL I / O-Subsystem nicht neu implementieren müssen. Allerdings gibt es keine vsscanf, aber es gibt Drittanbieter-Implementierungen im Web.

Wenn der Code fprintf verwenden, fscanf usw. indirection zwischen Dateien zu ermöglichen, und der Konsole, bist du immer noch kein Glück. Die Dateistruktur ist undurchsichtig, und im Gegensatz zu Pascal Textdateien, ein tragbares Textdatei-Treiber nicht implementiert werden können. Es könnte immer noch möglich sein, wenn Sie in Ihrem speziellen C RTL spelunk, aber Sie seien besser beraten, den Makro Weg hinunter und Ihren eigenen umbenannten Dateitypen Neuimplementierung.

Schließlich ist der „popen ()“ Ansatz ist möglich in Delphi und machte etwas leichter in Delphi 2009 mit den TTextReader und TTextWriter Klassen. Kombinieren dieser mit TFileStream um Rohre gewickelt, und gibt Rohre für Standardeingabe, Standardausgabe und Standardfehler in den neuen Prozess und STARTF_USESTDHANDLES usw. und es wird funktionieren. Wenn Sie Ihre eigenen nicht das Gefühl, wie das Schreiben gibt es Dritt Äquivalente / Proben auf dem Netz für zu Delphi. hier ein.

Andere Tipps

Unter Windows rufen Sie einfach Create mit dem SoX Befehl Linie. Ich weiß nicht, die Delphi-Bindings für Win32, aber ich habe genau dieses Ding in Win32 und C # getan.

Und jetzt, da Sie wissen, was Sie Create nennen wollen, eine Google-Suche auf, wie das von Delphi tun sollten Sie den gesamten Code geben Sie benötigen.

Delphi Corner Artikel - Createprocess verwenden, um Programme ausführen

Aufruf Createprocess () der einfache Weg

Sie könnten nicht einmal eine DLL benötigen, können Sie den popen () Funktion verwenden, um eine Konsolenanwendung auszuführen und jeden Ausgabetext sammeln.

Disclaimer: Ich weiß nichts über SoX. Es könnte sein, dass der Code strukturiert ist dies einfach zu machen, oder es könnte mehr hart sein. So oder so, das Verfahren ist das gleiche:

Zuerst wollen Sie die Funktionen in der SOx-Anwendung finden, die Sie anrufen möchten. Höchstwahrscheinlich wird die Konsolenanwendung hat Code in die Befehlszeile und ruft die entsprechenden Funktionen zu analysieren. Also zunächst einmal, finden Sie die Funktionen, die Sie verwenden möchten.

Als nächstes überprüfen Sie die Informationen aus auf Funktionen in DLLs von C an dieser Stelle exportieren: Erstellen und Mit DLLs

Dann eine neue Make-Datei machen oder Visual Studio Projektdatei mit dem Ziel um eine DLL zu sein, und fügen Sie den Quell aus dem SOx-Programm, das Sie geändert haben exportiert werden.

Führen Sie den Prozess, den Weg Indiv beraten und erfassen die Ausgabe wie wie Adam gezeigt hat.

Wenn Sie jedoch noch die DLL-Umwandlung tun wollen, dies wird Ihnen den Einstieg

  1. Konfigurieren SOX für Fenster und kompilieren
  2. Erstellen Sie ein leeres DLL-Projekt mit Ihrem C ++ Werkzeug
  3. Fügen Sie die SOX-Dateien Teil des Projekts
  4. sein
  5. Fügen Sie eine neue Funktion namens DLLMain

    BOOL APIENTRY DllMain (HENKEL hModule,                    DWORD ul_reason_for_call,                    LPVOID) {return TRUE;}

  6. eine DEF-Datei (mit dem Projektnamen als Dateinamen) hinzu, die die Exporte in den DLL auflistet - Fügen Sie den folgenden Inhalt es

    LIBRARY      "name.DLL" 
    

    EXPORTE

    CallOldMain PRIVATE

  7. Benennen Sie die Haupt von SOX als CallOldMain

  8. eine benutzerdefinierte Funktion schreibt die Ausgabe / Return-Fehler usw.

  9. anmelden
  10. Alle printfs / cout in der SOX-Anwendung und ersetzen sie durch Anrufe an Ihre benutzerdefinierte Funktion über

  11. Sobald die DLL Sie nun die Funktion CallOldMain mit den gleichen Parametern Hauptprogramme von C erwartet nennen kann kompiliert wird. Sie können diese Signatur ändern Sie den Fehler / Ausgabe von oben zurückzukehren.

Sie erwähnen nicht, was Ihr Toolchain, aber wenn Sie gcc in Windows zu konfigurieren, können Sie die normale Konfiguration verwenden, machen; make install nur SOx kompilieren. In dem Prozess wird es eine DLL-Datei, und die Konsole App erstellen. Oder Sie können nur das Make Ziel angeben, um nur die dll zu machen. Dies wird ein Fenster native Bibliothek kompiliert, die auf dem MS C Runtime DLL hängt nur, und Sie können dies in Ihrer eigenen App verwenden.

Sie können eine Konsolenanwendung ausführen und erfassen ihre Ausgangsleitungen verwendet wird. Sie verwenden une Seite des Rohres als stdout für die Createprocess und lesen Sie von der anderen Seite wie eine gemeinsame Datei.

Sie können ein funktionierendes Beispiel geschrieben in delphi hier sehen: http: // delphi.about.com/cs/adptips2001/a/bltip0201_2.htm

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top