- 締切済み
C♯ exeの起動結果を返す方法
C♯を学習中です。 以下のようなプログラムを作りたいと考えていますが、実現方法が分からないので質問をさせていただきます。 1.システムAがシステムBを起動する。 2.システムBは起動に成功したかシステムAに応答を返す。 起動成功の場合:0 起動失敗の場合:-1 3.システムAはシステムBからの応答を受け終了する。 4.システムBはコンソールに「Hello」を表示する。 上記の2の応答をどのようにすれば良いか分かりません。 returnで起動結果を返すと4の処理が行えないので困っています。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- tsukasa-12r
- ベストアンサー率65% (358/549)
SendMessage API で WM_COPYDATA を使用した例です。 A側 ( Windowsフォームアプリケーション・プロジェクトのプロパティの「ビルド」の「アンセーフコードの許可」にチェックを入れる必要あり ) using System; using System.Diagnostics; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { [StructLayout(LayoutKind.Sequential)] private struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; public IntPtr lpData; } private const int WM_COPYDATA = 0x004A; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Process.Start(@"C:\...\ConsoleApplication1.exe ", this.Handle.ToString()); } unsafe protected override void WndProc(ref Message m) { if( m.Msg == WM_COPYDATA ) { COPYDATASTRUCT *pcds = (COPYDATASTRUCT*)m.LParam.ToPointer(); if( pcds->cbData == 0 ) { MessageBox.Show("正常に起動しました。",this.Text, MessageBoxButtons.OK,MessageBoxIcon.Information); } else { MessageBox.Show("エラーです。", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } m.Result = new IntPtr(-1); this.Close(); } base.WndProc(ref m); } } } B側 ( コンソールアプリケーション ) using System; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Program { [DllImport("user32.dll", CharSet = CharSet.Auto)] static extern IntPtr SendMessage(int hWnd, UInt32 Msg, IntPtr wParam, ref COPYDATASTRUCT lParam); private const int WM_COPYDATA = 0x004A; [StructLayout(LayoutKind.Sequential)] private struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; public IntPtr lpData; } static void Main(string[] args) { int hWnd; if( 0 < args.Length ) { if (int.TryParse(args[0], out hWnd) == true) { COPYDATASTRUCT cds = new COPYDATASTRUCT(); cds.cbData = 0; SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, ref cds); } } Console.WriteLine("Hello"); Console.ReadLine(); } } } ちなみに、 >起動失敗の場合:-1 とのことですが、応答を返すプログラムがつもりのBがそもそも起動していないのですから、応答することはできません。(死人に話しかけても返事がないのと同じ)
- ueno29_desu
- ベストアンサー率100% (1/1)
プロセス間通信で片付くのでは http://d.hatena.ne.jp/tetsuarossa/20070305/p1 が参考になるでしょう。