Discussion:
1つのPCにおけるWindows アプリケーション通信
(too old to reply)
C#Sharp.com
2005-07-11 05:53:02 UTC
Permalink
お世話になります。
Windows のアプリケーションプログラム2つを用意し、
その2つのアプリケーションで、データのやり取りが出来るのでしょうか?

たとえば、a.exeとb.exeのアプリケーションがあった場合、
a.exe から b.exe に対し、データ" 0010 "というデータを認識させ、
処理し、その結果を逆に b.exeからa.exeにデータ”1000"というデータを
送信することを行ないたく思います。

a.exeからハードディスク等にデータを保存し、b.exeは、ハードディスク内のデータを読み取ることでコマンドのやり取りを行なえますが、
排他制御等を行なう必要がありますので、処理が難しく
困っています。

何か解決策等ありましたら、ご教示お願いします。
Kaoru Kodaka
2005-07-11 07:19:51 UTC
Permalink
$B$+$*$/(B $B$G$9!#(B

On Sun, 10 Jul 2005 22:53:02 -0700
Windows $B$N%"%W%j%1!<%7%g%s%W%m%0%i%`#2$D$rMQ0U$7!"(B
$B$=$N#2$D$N%"%W%j%1!<%7%g%s$G!"%G!<%?$N$d$j<h$j$,=PMh$k$N$G$7$g$&$+!)(B
$B$$$o$f$k!"%W%m%;%94VDL?.$H$$$&$d$D$G$9$M!#(B

C# $B$G$O(B($B$H$$$&$+(B .NET $B$G$OD>@\MxMQ$G$-$^$;$s$,(B) Window $B%a%C(B
$B%;!<%8JU$j$r;H$C$?J}K!$,4JC1$@$H;W$$$^$9!#%j%b!<%F%#%s%0$r;H(B
$B$&$H$J$k$H!"7k9=OC$,Bg$-$/$J$C$F$7$^$$$^$9$N$G!#(B

Win32 API $B$N(B SendMessage()$B!"(BPostMessage() $B$J$I$N4X?t!"(B
WM_COPYDATA $B$J$I$N%a%C%;!<%8$rD4$Y$F$_$F$/$@$5$$!#(B

---
MVP kaok = MVP.ChangeMvpCategory("for C# 2004-2006.");
kaok.Web = "http://www.antoine.st/";
C#Sharp.com
2005-07-14 01:37:01 UTC
Permalink
お世話になります。
プロセス間通信のやり方が大体分かりましたが、
データ送信先のアプリケーションについてのハンドルが分からないため
困っています。
下記のようにFindWindowを使用すれば、Handle_test、についての
ハンドルが取れると思ったのですが、取れません。

int h = FindWindow("Handle_test",null);
if (h != 0)
{
 SendMessage( h,WM_COPYDATA, 0, 0 );
}
else
{
 MessageBox.Show("ERRRR");
}

ちなみに、int h = FindWindow("notepad",null);にすると
Notepadのハンドルが取れます。
又、Process.ProcessName プロパティで、プロセスの名前(Handle_test)を取得することが出来ます。

ご教示いただきたくよろしくお願いします。
かおく です。
On Sun, 10 Jul 2005 22:53:02 -0700
Post by C#Sharp.com
Windows のアプリケーションプログラム2つを用意し、
その2つのアプリケーションで、データのやり取りが出来るのでしょうか?
いわゆる、プロセス間通信というやつですね。
C# では(というか .NET では直接利用できませんが) Window メッ
セージ辺りを使った方法が簡単だと思います。リモーティングを使
うとなると、結構話が大きくなってしまいますので。
Win32 API の SendMessage()、PostMessage() などの関数、
WM_COPYDATA などのメッセージを調べてみてください。
---
MVP kaok = MVP.ChangeMvpCategory("for C# 2004-2006.");
kaok.Web = "http://www.antoine.st/";
Takahashi Masahiro
2005-07-14 02:55:51 UTC
Permalink
$B9b66$G$9(B
"C#Sharp.com" wrote in message
$B%W%m%;%94VDL?.$N$d$jJ}$,BgBNJ,$+$j$^$7$?$,!"(B
$B:$$C$F$$$^$9!#(B
$B2<5-$N$h$&$K(BFindWindow$B$r;HMQ$9$l$P!"(BHandle_test$B!"$K$D$$$F$N(B
$B%O%s%I%k$,<h$l$k$H;W$C$?$N$G$9$,!"<h$l$^$;$s!#(B
int h = FindWindow("Handle_test",null);
if (h != 0)
{
$B!!(BSendMessage( h,WM_COPYDATA, 0, 0 );
}
else
{
$B!!(BMessageBox.Show("ERRRR");
}
$B$A$J$_$K!"(Bint h = FindWindow("notepad",null);$B$K$9$k$H(B
Notepad$B$N%O%s%I%k$,<h$l$^$9!#(B
FindWindow$B$NBh0l0z?t$O(B $B%/%i%9L>$G$9(B SPY++$B$J$I$G3NG'$7$F$_$^$7$g$&(B
$B%&%#%s%I%&%?%$%H%k$G8!:w$9$k$N$G$"$l$P(B $BBhFs0z?t$KM?$($J$1$l$P$$$1$^$;$s$h(B
SPY++ $B$G%&%#%s%I%&$r8!:w$7$F(B $B$=$N%W%m%Q%F%#$N%/%i%9%?%V$N%/%i%9L>$r3NG'$7$^$7$g$&(B

Process$B%*%V%8%'%/%H$,<hF@$G$-$F$$$k$N$G$"$l$P(B MainWindowHandle$B%W%m%Q%F%#$G(B
$B%O%s%I%k$O<hF@$G$-$k$H;W$$$^$9$h(B ...
--
$B9b66@/9((B ***@yahoo.co.jp
Microsoft MVP Visual C++
$BJV?.$O!X%0%k!<%W$XJV?.!Y$G(B ...
C#Sharp.com
2005-07-14 08:06:04 UTC
Permalink
お世話になります。
spy++は便利ですね。大変役に立ちました。
そこで,下記のようにプログラムを作成し、WM_COPYDATAを用い、
アプリケーションに対しデータを送信しています。
そこで、データ送信できていないことが分かりました。
なぜか知っていたら教えてください。ほとほと疲れました。;^^
又、WM_COPYDATAは、下記のように宣言していますが
WM_COPYDATAの値を調べてわざわざ記述する
必要があるのでしょうか?
何かよい対策方法などありましたらご教示お願いします。

○送信側ソースコード
const int WM_COPYDATA = 74;
string ClassName = "WindowsForms10.Window.8.app3";
string WindowName = "Form1";
int WindowHandle = FindWindow(ClassName, WindowName);
if (WindowHandle != 0)
{
SendMessage( WindowHandle,WM_COPYDATA, 0, 0 );
SendMessage( WindowHandle,0x8000, 0, 0 );
}
else
{
MessageBox.Show("ERRRR");
}

○受信側ソースコード
const int WM_COPYDATA = 74;
protected override void WndProc(ref Message m)
{
if ( m.Msg == 0x8000 )
{
MessageBox.Show("メッセージ受信","実行結果");
}
else if (m.Msg == WM_COPYDATA)
{
MessageBox.Show("実行結果");←--この部分のソースコードが実行されません。
}
base.WndProc (ref m);
}
UETA, Shin-ichi
2005-07-14 09:00:54 UTC
Permalink
こんにちは、植田です。
Post by C#Sharp.com
SendMessage( WindowHandle,WM_COPYDATA, 0, 0 );
適切なパラメータを設定していないので、WM_COPYDATA
メッセージの送信そのものが失敗しているのでは?

WM_COPYDATA Message
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/dataexchange/datacopy/datacopyreference/datacopymessages/wm_copydata.asp
Post by C#Sharp.com
SendMessage( WindowHandle,0x8000, 0, 0 );
0x8000、つまりWM_APPメッセージですね。ほかにもユーザー
定義メッセージとしてWM_USER(=0x0400)が用意されています。
WM_USERとWM_APPはそれを基点として一定の範囲の値を
自由に使えます。
ただし、条件によってはWM_USER+αはシステムメッセージと
競合する場合があるので、WM_APP+αの方がより安全です。

WM_APP Notification
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesmessages/wm_app.asp

データを渡す必要がなければメッセージの値だけで制御できる
ようにプロトコルを決めてしまえばよろしいのでは?
--
植田システム設計事務所
Ueta System Design Studio
http://www.usdesign.jp/
植田真一
mailto:***@usdesign.jp
Kaoru Kodaka
2005-07-14 09:20:28 UTC
Permalink
$B$+$*$/(B $B$G$9!#(B

On Thu, 14 Jul 2005 01:06:04 -0700
$B%"%W%j%1!<%7%g%s$KBP$7%G!<%?$rAw?.$7$F$$$^$9!#(B
$B$=$3$G!"%G!<%?Aw?.$G$-$F$$$J$$$3$H$,J,$+$j$^$7$?!#(B
$***@5$7$$%&%#%s%I%&%O%s%I%k$,<h$l$F$$$k$+(B
SendMessage() $B$***@k8@$***@5$7$$$+(B
SendMessage() $B$G2?$i$+$N%&%#%s%I%&%a%C%;!<%8$OAw$l$k$+(B
WndProc $B$NCf$G2?$i$+$N%&%#%s%I%&%a%C%;!<%8$O<hF@$G$-$k$+(B

$B$J$I$r=g$rDI$C$FD4$Y$F$_$F$O$$$+$,$G$7$g$&$+!#(B
WM_COPYDATA$B$NCM$rD4$Y$F$o$6$o$65-=R$9$k(B
$BI,MW$,$"$k$N$G$7$g$&$+!)(B
$BI,MW$G$9!#(B

---
MVP kaok = MVP.ChangeMvpCategory("for C# 2004-2006.");
kaok.Web = "http://www.antoine.st/";
C#Sharp.com
2005-07-28 14:19:14 UTC
Permalink
お世話になります。
宣言文を下記にすると直りました。
static extern uint SendMessage(IntPtr window, int msg, IntPtr wParam, ref
COPYDATASTRUCT lParam);

植田さん、かおくさんありがとうございました。
C#Sharp.com
2005-07-26 12:16:16 UTC
Permalink
お世話になります。
アプリケーション間で30byte程度のデータ送受信を行いたいのですが、
SendMessage、PostMessageでは、データが送れない為、何かいい方法がないか検討しています。

何かいいAPIはありますでしょうか?
ハードディスクにデータを保存してやり取りすれば出来ますが
面倒なので何かいい手立てがあれば教えてください。

以上、ご教示お願いします。
かおく です。
On Sun, 10 Jul 2005 22:53:02 -0700
Post by C#Sharp.com
Windows のアプリケーションプログラム2つを用意し、
その2つのアプリケーションで、データのやり取りが出来るのでしょうか?
いわゆる、プロセス間通信というやつですね。
C# では(というか .NET では直接利用できませんが) Window メッ
セージ辺りを使った方法が簡単だと思います。リモーティングを使
うとなると、結構話が大きくなってしまいますので。
Win32 API の SendMessage()、PostMessage() などの関数、
WM_COPYDATA などのメッセージを調べてみてください。
---
MVP kaok = MVP.ChangeMvpCategory("for C# 2004-2006.");
kaok.Web = "http://www.antoine.st/";
UETA, Shin-ichi
2005-07-26 14:15:07 UTC
Permalink
どうも、植田です。
Post by C#Sharp.com
アプリケーション間で30byte程度のデータ送受信を行いたいのですが、
SendMessage、PostMessageでは、データが送れない為、何かいい方法がないか検討しています。
そのためのWM_COPYDATAメッセージでは?
Post by C#Sharp.com
何かいいAPIはありますでしょうか?
DDE(Dynamic Data Exchange)、ActiveX/COM、ソケット、パイプ
共有メモリといった手段もあります。
これらのキーワードでググってみては?

あ、でもC#ということは.NETか...。.NETならではの手法があるかも。
他の方のフォローに期待 ^^;)
--
植田システム設計事務所
Ueta System Design Studio
http://www.usdesign.jp/
植田真一
mailto:***@usdesign.jp
Kaoru Kodaka
2005-07-27 06:20:45 UTC
Permalink
$B$+$*$/(B $B$G$9!#(B

On Tue, 26 Jul 2005 23:15:07 +0900
$B$"!"$G$b(BC#$B$H$$$&$3$H$O(B.NET$B$+(B...$B!#(B.NET$B$J$i$G$O$N<jK!$,$"$k$+$b!#(B
.NET $B$J$i$G$O!"$H$$$&$3$H$@$H!"(BRemoting $B$G$9$M!#(B1.x $B$G$O!"%=(B
$B%1%C%H$r%Y!<%9$H$7$?Bg3]$+$j$J$b$N$G$9$,!"(B2.0 $B$G$O%W%m%;%94V(B
$BDL?.MQ$N$b$N$,MQ0U$5$l$F$$$^$9!#(B

---
MVP kaok = MVP.ChangeMvpCategory("for C# 2004-2006.");
kaok.Web = "http://www.antoine.st/";
C#Sharp.com
2006-03-22 11:12:27 UTC
Permalink
お世話になります。
下記は、.NET Remote処理、DllImport処理になると思います。
.NETのみで開発を行った場合、どちらが有効でしょうか?

ウィンドウメッセージを使用するとメッセージの管理が大変でしかも、
番号が有限であり、今後SDKのAPIがなくなる可能性がありますので
NET Remote処理が有効のように思います。

しかし、パフォーマンス、メモリ関連等からはよくわかりません。

何か今後の方向性等から皆さんのご意見をお聞きしたくよろしくお願いします。
かおく です。
On Tue, 26 Jul 2005 23:15:07 +0900
Post by UETA, Shin-ichi
あ、でもC#ということは.NETか...。.NETならではの手法があるかも。
..NET ならでは、ということだと、Remoting ですね。1.x では、ソ
ケットをベースとした大掛かりなものですが、2.0 ではプロセス間
通信用のものが用意されています。
---
MVP kaok = MVP.ChangeMvpCategory("for C# 2004-2006.");
kaok.Web = "http://www.antoine.st/";
Loading...