2009-10-27 9 views
24

Delphi 2007を使用してコンソールアプリケーションとGUIバージョンの両方で単一のプログラムを動作させることができますか?コンソールとGUIの両方でプログラムする

私は、プログラムが適切なコマンドラインオプションで実行されている場合、コンソールプログラムとして機能し、WRITELNを使用してコンソールに出力を出力する必要がありますが、通常のDelphiのGUIアプリケーションとして?

コンソールアプリケーションとして実行すると、コマンドラインインタプリタは新しいコマンドを入力する前にアプリケーションが終了するのを待つが、コマンドラインから起動したGUIアプリケーションはすぐにコマンドラインに戻るGUIアプリケーションは分離されたプロセスで開始されます。私はこの行動を保持したい。

私はこのような何かを気にしない:

IF THEN GUI StartApplicationAsGUI(ParamStr(0))

すなわち。 GUIバージョンの起動時にコマンドラインインターフェイスがコマンドライン入力に戻る限り、必要に応じてGUIモードで起動するために、何らかのEXECUTE呼び出しを使用してアプリケーションを再起動する必要はありません。

私の線に沿っているソリューション/提案好む:ELSE Con​​soleMode THEN
      RunConsole(パラメータ)

を始めたら

<解析Comnandライン>
を      Application.Initialize;
      Application.CreateForm(...)
      Application.Run;
END

(またはその逆、すなわち。特別な方法GUIモードであれば物事を)GUIインターフェイスを作るとき、私はまだDelphiのIDEとVCLを使用することができるように

...

答えて

4

Windowsは、コンソールとUIアプリケーションの実行可能ファイルのヘッダに異なる値を持っています(詳細はhereを参照してください)。したがって、両方のモードで動作するように同じ実行可能ファイルを作成することは不可能です。

代わりに、UIアプリでコンソールを開くことはできますが、アプリを起動したコンソールではなく新しいコンソールになります。

12

これは少し難解です。実際、コンソールアプリケーションとGUIの区別は、PEヘッダーの単一のフラグです。ウィンドウを作成するコンソールアプリケーションは簡単に書くことができますが、コンソールウィンドウを常に表示しています(隠すこともできますが、ユーザーがcmdからプログラムを実行するとうまくいかない場合があります)。

あなたはは、しかしAllocConsole機能を使用して、それが必要な場合は、コンソールを作成するGUIアプリケーションを書くことができます:

プロセスは一つだけのコンソールに関連付けられているので、AllocConsole機能することができます呼び出し元のプロセスにすでにコンソールがある場合は失敗します。プロセスはFreeConsole関数を使用して現在のコンソールから自分自身を切り離し、次にAllocConsoleを呼び出して新しいコンソールを作成するか、別のコンソールに接続するAttachConsoleを呼び出すことができます。

呼び出しプロセスが子プロセスを作成する場合、子プロセスは新しいコンソールを継承します。

AllocConsoleは、新しいコンソールの標準入力、標準出力、および標準エラーハンドルを初期化します。標準入力ハンドルはコンソールの入力バッファへのハンドルで、標準出力ハンドルと標準エラーハンドルはコンソールのスクリーンバッファへのハンドルです。これらのハンドルを取得するには、GetStdHandle関数を使用します。

この機能は、主にグラフィカルユーザーインターフェイス(GUI)アプリケーションでコンソールウィンドウを作成するために使用されます。 GUIアプリケーションは、コンソールなしで初期化されます。コンソールアプリケーションは、(DETACHED_PROCESSフラグを指定してCreateProcess関数を呼び出して)分離プロセスとして作成されない限り、コンソールで初期化されます。

ただし、cmdから実行すると、既存のコンソールウィンドウを再利用する代わりに別のコンソールウィンドウが表示される可能性があります。そこに良い解決策があるかどうかはわかりません。

12

IMO、ここでの最善のアプローチは、実際にプログラムの作業を行う非ビジュアルクラスを持つことです。その後、GUIプログラムから呼び出すことができ、別のコマンドラインプログラムから呼び出すこともできます。両方のプログラムはあなたのクラスの機能を包むラッパーです。

これにより、デザインもきれいになります。クラスはアプリケーションのGUIレイヤから分離されている必要があります。

+2

これは正しい答えです。 – Tim

+0

このアプローチの問題点は、1)コマンドライン実行可能ファイル、2)GUI実行ファイル、3)プログラムの関連するコアを含むライブラリファイルの3つのファイルの配布が必要であることです。私は1つの実行可能ファイルを好むだろうし、最良のオプションは、GUIで実行する必要がある場合、分離されたコンソールで自身を再起動できるヘッダーにコンソールビットを持つGUIプログラムを持つようだ。提供される様々なリンクのildasmのように。 – HeartWare

+0

私は、実行可能ファイルが2つしかないと言うでしょう。 BPLを含むEXEを構築する場合、アプリケーションごとに1つのexeだけ、「コア」ファイルを配布する必要はありません。しかし、明らかにあなたはあなたの展開の必要性を知っている人です。私はildasmの答えが役に立つとうれしいです。 – JosephStyons

3

親コンソールを保持するためにAttachConsole()を使用することができます。 など。アプリケーションがCMDLINEシェルから開始された場合、AllocConsole()は避けることができます:ここ

if not AttachConsole(ATTACH_PARENT_PROCESS) 
then AllocConsole; 

詳細情報:「あなたがすることはできません、: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681952(v=vs.85).aspx

+0

Chee Weeのコード例はこちらです:http://chuacw.ath.cx/blogs/chuacw/archive/2015/12/02/delphi-app-with-console-and-gui.aspx – dummzeuch

関連する問題