質問

電話することに興味があります SoX, 、別の Windows GUI プログラム (当然 Delphi で書かれたもの) からのオープン ソース コンソール アプリケーションです。コンソール ウィンドウをスクレイピングして非表示にするのではなく、アプリケーションをアプリケーションから呼び出せる DLL に変換するだけで済みます。

この道を歩み始める前に、どのくらいの作業が必要になるか知りたいと思っています。私たちは大規模な取り組みについて話しているのでしょうか、それとも直接的な解決策はあるのでしょうか?私は C 言語については多少の知識はありますが、決して専門家ではありません。

SoX 固有の詳細は期待していません。一般的に、EXE コンソール アプリケーションを DLL に変換するだけです。ただし、誰かが SoX に精通していれば、さらに良いでしょう。

役に立ちましたか?

解決

C ソース コードを変更してコンソール実行可能ファイルをライブラリに変換するという特定のトピックについては、コマンド ライン アプリケーションがどのように考慮されるかによって異なります。I/O が少数の関数セット、またはさらに優れた関数ポインターを通じて集中されるように記述されている場合、明らかにそれは簡単になります。

すべて printf、scanf、およびその仲間を使用して実行する場合は、すべてのソース ファイルにインクルードされるインクルード ファイルを見つけて作成し、printf/scanf およびその仲間を作成した独自の関数にリダイレクトするマクロを追加するのが最善でしょう。 DLL の実装に適するように。printf などは vsnprintf から構築できるため (安全のため n バージョンを使用してください)、C RTL I/O サブシステム全体を再実装する必要はありません。ただし、vsscanf はありませんが、Web 上にはサードパーティの実装があります。

コードで fprintf、fscanf などを使用している場合。ファイルとコンソール間の間接参照を有効にしても、まだ運が悪いです。FILE 構造は不透明であり、Pascal テキスト ファイルとは異なり、ポータブル テキスト ファイル ドライバーを実装できません。特定の C RTL でスペランクを実行する場合はまだ可能かもしれませんが、マクロ ルートをたどって、名前を変更した独自の FILE タイプを再実装することをお勧めします。

最後に、「popen()」アプローチは Delphi で可能であり、Delphi 2009 では TTextReader クラスと TTextWriter クラスを使用することでいくらか簡単になりました。これらをパイプで囲んだTFileStreamと組み合わせて、新規プロセスやSTARTF_USESTDHANDLESなどに標準入力、標準出力、標準エラーのパイプを指定すれば動作します。自分で作成する気がない場合は、Web 上に Delphi 用のサードパーティの同等品やサンプルもあります。 ここに 1 つあります。

他のヒント

Windows では、ただ呼び出すだけです プロセスの作成 SoX コマンドラインを使用します。Win32 の Delphi バインディングはわかりませんが、これとまったく同じことを Win32 と C# の両方で実行しました。

CreateProcess を呼び出す必要があることがわかったので、Delphi からそれを行う方法を Google 検索すると、必要なコードがすべて得られるはずです。

Delphi コーナー記事 - CreateProcess を使用したプログラムの実行

CreateProcess() を簡単に呼び出す方法

DLL さえ必要ない場合もあります。 ポペン() コンソール アプリケーションを実行し、出力テキストを収集する関数。

免責事項:SoX については何も知りません。コードがこれを容易にするように構造化されている可能性もありますが、より困難である可能性もあります。どちらの方法でも、プロセスは同じです。

まず、SoX アプリケーション内で呼び出したい関数を見つけます。おそらく、コンソール アプリには、コマンド ラインを解析して適切な関数を呼び出すコードが含まれています。まずは、使いたい機能を見つけてください。

次に、このサイトで C から DLL 内の関数をエクスポートする方法についての情報を確認してください。 DLL の作成と使用

次に、DLL をターゲットとする新しい Makefile または Visual Studio プロジェクト ファイルを作成し、エクスポートするように変更した SoX プログラムのソースファイルを追加します。

Indiv がアドバイスした方法でプロセスを実行し、Adam が示したように出力をキャプチャします。

ただし、それでも DLL 変換を実行したい場合は、これで開始できます。

  1. Windows 用の SOX を構成してコンパイルする
  2. C++ ツールを使用して空の DLL プロジェクトを作成する
  3. SOX ファイルをプロジェクトの一部として追加します。
  4. DLLMain という新しい関数を追加します。

    bool apientry dllmain(handle hmodule、dword ul_reason_for_call、lpvoid){return true;}

  5. DLL 内のエクスポートをリストする .DEF ファイルを追加します (ファイル名としてプロジェクト名を使用します)。それに次のコンテンツを追加します。

    LIBRARY      "name.DLL" 
    

    輸出

    CallOldMain PRIVATE

  6. SOX のメインの名前を CallOldMain に変更します

  7. 出力/戻りエラーなどをログに記録する CUSTOM 関数を作成します。

  8. SOX アプリケーション内のすべての printfs / cout を検索し、上記のカスタム関数の呼び出しに置き換えます。

  9. DLL がコンパイルされると、C のメイン プログラムが期待するのと同じパラメータを使用して関数 CallOldMain を呼び出すことができます。この署名を変更して、上記のエラー/出力を返すことができます。

ツールチェーンが何であるかについては言及していませんが、Windows で gcc を設定している場合は、通常の config;make;make install を使用して sox をコンパイルするだけです。その過程で、dll ファイルとコンソール アプリが作成されます。または、make ターゲットを指定して dll のみを作成することもできます。これにより、MS C ランタイム DLL のみに依存する Windows ネイティブ ライブラリがコンパイルされ、これを独自のアプリで使用できます。

コンソール アプリケーションを実行し、パイプを使用してその出力をキャプチャできます。パイプの一方の側を CreateProcess の標準出力として使用し、もう一方の側から共通ファイルのように読み取ります。

ここで、delphi で書かれた実際の例を確認できます。 http://delphi.about.com/cs/adptips2001/a/bltip0201_2.htm

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top