4

オープン ソースのコンソール アプリケーションであるSoXを別の Windows GUI プログラム (自然に Delphi で記述) から呼び出すことに興味があります。コンソール ウィンドウをスクレイピングして非表示にするのではなく、アプリケーションから呼び出すことができる DLL にアプリケーションを変換したいと考えています。

この道を歩み始める前に、どのくらいの仕事を期待すべきか知りたいです。私たちは大事業について話しているのでしょうか、それとも簡単な解決策はありますか? 私は C をある程度知っていますが、決して専門家ではありません。

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

4

7 に答える 7

6

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つです。

于 2008-09-25T03:43:29.353 に答える
5

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

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

Delphi コーナー記事 - CreateProcess を使用してプログラムを実行する

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

于 2008-09-25T02:51:23.673 に答える
4

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

于 2008-09-25T02:49:21.543 に答える
4

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

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

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

    BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID ) {TRUE を返す;}

  5. DLL 内のエクスポートを一覧表示する .DEF ファイル (プロジェクト名をファイル名として使用) を追加します。次の内容を追加します。

    LIBRARY      "name.DLL" 
    

    輸出

    CallOldMain プライベート

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

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

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

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

于 2008-09-25T03:48:33.397 に答える
3

免責事項: 私は SoX について何も知りません。コードがこれを簡単にするように構成されている場合もあれば、より難しい場合もあります。どちらの方法でも、プロセスは同じです。

まず、呼び出したい SoX アプリケーションの関数を見つけます。ほとんどの場合、コンソール アプリには、コマンド ラインを解析して適切な関数を呼び出すためのコードが含まれています。まずは、使いたい機能を見つけてください。

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

次に、ターゲットが DLL である新しいメイクファイルまたはビジュアル スタジオ プロジェクト ファイルを作成し、エクスポートするために変更した SoX プログラムからソースファイルを追加します。

于 2008-09-25T03:01:36.163 に答える
1

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

ここでdelphiで書かれた実用的な例を見ることができます:http://delphi.about.com/cs/adptips2001/a/bltip0201_2.htm

于 2008-09-25T08:47:45.567 に答える
1

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

于 2008-09-25T05:00:07.983 に答える