- PR -

DLL同士の通信

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-04 10:01
引用:

さらださんの書き込み (2004-02-04 02:51) より:

探しているうち、.NET Remotingだのメッセージキューだのキーワードは見つけたの
ですが、どちらかというとネットワーク上でのサーバとのやりとり・他端末とのやりとりの
内容が多く、私にはちょっと敷居が高く、適当なサンプルも見つけることができません
でした。


 いや、「.NET リモート処理」で良さそうですよ!!ネットワークに限定していません。「アプリケーションドメイン間の通信」とあります。ここで「アプリケーションドメイン」というのは、乱暴に1つのEXE、DLLと考えてください。詳しくはこちらの連載(進んでないけど)。これで扱うのは「アプリケーションドメイン間の通信」なので、アプリケーションドメインが“別のコンピュータ”にあっても手順は変わらない、ということです。

 とりあえず、オンラインはこちら。オフラインは、「基本的な .NET リモート処理アプリケーションの構築」トピックを検索してください。

 なお、.NETのセキュリティがかかるようですが、同じコンピュータのディレクトリからロードされたアプリケーションドメイン間なら問題ないでしょう。
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2004-02-04 12:05
みなさん、
新たな情報ありがとうございます。

引用:

#EXE間の通信はSendMessage()で行うほうが簡単ですよ。
#FindWindow?とかでWindowハンドルって割と簡単に手に入りますから。


ってあるのですが、
これは、DLL間の通信でも、SendMessage()の方が
簡単にできるのでしょうか!?


引用:

引用:

さらださんの書き込み (2004-02-04 02:51) より:

探しているうち、.NET Remotingだのメッセージキューだのキーワードは見つけたの
ですが、どちらかというとネットワーク上でのサーバとのやりとり・他端末とのやりとりの
内容が多く、私にはちょっと敷居が高く、適当なサンプルも見つけることができません
でした。


 いや、「.NET リモート処理」で良さそうですよ!!ネットワークに限定していません。



そのようですね!
同一マシン上でも可能のようですね。
けど、うまく動かない(笑)



本題ですが、
MFCはあまり用いたくないので、
SendMessage()かMapViewOfFile()かですかねぇ。
いろいろ調べてみます。
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2004-02-04 14:39
ところで・・・。

サンプルとしてTextBox1のテキストを、
TextBox2に表示する、、、ってやっていたのですが、
実際のところ、
複数のデータを構造体(またはArrayList)で保持し、
それを別プロセスから参照しようかと思っていたのですが、
この場合もSendMessage()やMapViewOfFile()で
可能なのでしょうか!?

単一のデータしか参照できないってことでしょうか?

ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-02-04 14:48
ども、ほむらです。
------
優希氏へ
引用:

これは、DLL間の通信でも、SendMessage()の方が
簡単にできるのでしょうか!?


EXE間ということ、語弊がありますね。
ウィンドウ間といったほうがよかったですね。。。
DLL同士の通信とかはあまり考えたことありません。
現実問題ありえませんから^^;;;;;

もしもSendMessage()を利用するのならば
結果を受け取るための構造体をLPARAMにいれて挙げればよいと思いますよ
子画面2でメッセージを発行して子画面1でメッセージを処理する形
ただ、オブジェクト間の結合度高いので分ける必要性に疑問も浮かんできてしまいますけど


以下、別口
後初めてソース見てみたのですけど^^;;;;
ポインタの使い方がへんだったりdeleteが無かったりとか
.NETのよくわかりませんが。
コードはあっているのでしょうか?
コード:

// 子画面1生成
Object *param[] = new Object*[2];
param[0] = S".\\Child1.dll"; // DLL名称
param[1] = picBack_1; // 子画面を追加するPictureBox


#追記、ここはおかしくなかったですね^^;;;僕の勘違いです。

コード:

// テキストボックス1の内容を取得
String *GetData()
{
return textBox1->Text;
};



コード:

String *strTextContent = wrapInst->GetData(); // TextBox1の内容を取得
if(strTextContent != 0){
// テキストボックス1の内容を表示
textBox2->Text = strTextContent;
}


それに、タイマーの中でDLLをロードしているところとか

[ メッセージ編集済み 編集者: ほむら 編集日時 2004-02-04 15:04 ]
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-02-04 16:33
こんにちわ。
蛇足になってしまうかもしれませんが。
SendMessageは、メッセージが終わるまで制御が帰ってこないので、
場合によってはPostMessageの方が良いかもしれません。

ちなみに、ウィンドウの無いDLLなどではメッセージを受け取ることは出来ない
ので、「直接DLL間で通信」は無理かと思います。
ほむらさんの例は、DLLを呼ぶ画面でのメッセージの処理を言われているのだと
思いますが。

MapViewOfFileは、いわゆる共有メモリ(一般的な呼び方かどうか知りませんが)
ですね。これは単に別プロセスなどから同じアドレスに対して読み書きできるように
するものですから、実現は特に難しくないと思います。

---以下さらに蛇足(DLLで実現可能かどうか分かりません)
SendMessage、PostMessageはウィンドウにメッセージを送りますが、
PostThreadMessageというのもあり、これはスレッドにメッセージを
送ります。つまり、ウィンドウが無くてもメッセージを送れます。
(かわりにスレッドIDが必要ですが^^;)
また、メッセージを受け取る部分も一応自作できます。
方法は、スレッドをひとつ作成し、そのなかで無限ループを作成して
そのなかでGetMessageをコールするだけです。

参考にすらならないかもしれませんが・・・^^;
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-04 17:01
引用:

ほむらさんの書き込み (2004-02-04 14:48) より:

後初めてソース見てみたのですけど^^;;;;
ポインタの使い方がへんだったりdeleteが無かったりとか
.NETのよくわかりませんが。
コードはあっているのでしょうか?


 ソースは読んでいないので確かなことは言えませんが、マネージドなクラスをnewすると、deleteしてはいけません。いけないと、MSDNに書いてあるんです、どこか忘れたけど。こちらのスレッドで吼えてます。
#今なら「≒」を使う。。。


#####
 今晩、息子と妻が許してくれれば、サンプル作ってみます。ただし、C#orVB.NET。C++は・・・忘れてる!!ショック。。。
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2004-02-04 17:27
アドバイス、ありがとうございます。

SendMessage()に関して、
引用:

ウィンドウの無いDLLなどではメッセージを受け取ることは出来ない


・・・とのことですが、
ウィンドウって Formを生成していないと、、、
ってことですか?


それと、MapViewOfFile()なんですが、
「指定した変数を共有メモリに置いておく」という
イメージなのですか?
"ハンドル"ってモノが何を指すのか
よく分からなくって。。。

理解できてなくって、すいませんm(_ _)m


引用:

マネージドなクラスをnewすると、deleteしてはいけません。
いけないと、MSDNに書いてあるんです、


一番初めのソースで
どこか間違えてコーディングしてましたかな!?(^^;)


引用:

#####
 今晩、息子と妻が許してくれれば、サンプル作ってみます。
ただし、C#orVB.NET。C++は・・・忘れてる!!ショック。。。


ありがとうございます。
C#でも十分参考になります。
自分もいろいろ調べてみます。
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2004-02-04 17:43
ども。がると申します。
.NETをしらないというかWindowsの世界を把握していないので
「斜めに」読んでいただけるとありがたいのですが。
Windowsって「プロセス間通信」は存在しないですか?
UNIXだと、たまに使う技術だと思うのですが。
(たま〜〜にですが(笑))

キーワードとしては
・セマフォ
・共有メモリ
・メッセージ
あたりかなぁ、と。

なにかのヒントにでもなれば幸いです ^^

スキルアップ/キャリアアップ(JOB@IT)