【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言

C♯を学習中です。

以下のようなプログラムを作りたいと考えていますが、実現方法が分からないので質問をさせていただきます。

1.システムAがシステムBを起動する。
2.システムBは起動に成功したかシステムAに応答を返す。
 起動成功の場合:0
 起動失敗の場合:-1
3.システムAはシステムBからの応答を受け終了する。
4.システムBはコンソールに「Hello」を表示する。

上記の2の応答をどのようにすれば良いか分かりません。
returnで起動結果を返すと4の処理が行えないので困っています。

A 回答 (2件)

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がそもそも起動していないのですから、応答することはできません。(死人に話しかけても返事がないのと同じ)
    • good
    • 0

プロセス間通信で片付くのでは



http://d.hatena.ne.jp/tetsuarossa/20070305/p1

が参考になるでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報