- PR -

DLL同士の通信

投稿者投稿内容
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-02-04 17:44
引用:

優希さんの書き込み (2004-02-04 17:27) より:

SendMessage()に関して、
引用:

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


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


SendMessageの引数を見ていただければ分かるかと思いますが、
ウィンドウハンドルが必要なのです。

引用:

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


表現は微妙ですがイメージは合ってそうですね^^;

んーと、要するに、ファイルに読み書きするようなことを
メモリに対して行うような感じです。
ハンドルは、ファイルハンドルと同じように考えてもらえば
いいかも・・・

ちなみに、構造体も直接共有メモリに置けますよー。
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-02-04 17:49
こんにちわ。

引用:

がるがるさんの書き込み (2004-02-04 17:43) より:
ども。がると申します。
.NETをしらないというかWindowsの世界を把握していないので
「斜めに」読んでいただけるとありがたいのですが。
Windowsって「プロセス間通信」は存在しないですか?
UNIXだと、たまに使う技術だと思うのですが。
(たま〜〜にですが(笑))

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

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



プロセス間通信の考え方は当然あるのですが、
(3つの例は全部可能だと思います)
DLLってプロセスじゃないですよね?^^;
DLL間で直接通信するのは、かなりの制限が
あると思われます。

揚げ足取りのようで申し訳ないのですが・・・
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2004-02-04 17:55
引用:

ちなみに、構造体も直接共有メモリに置けますよー。



おぉ!
そうですか(笑)
助言、有難う御座います。
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-02-04 18:12
もう一度初めの質問内容を振り返ってみます。

DLL同士の通信ということですが、この状況は本来ありえません。
DLLは何らかの実行プロセスに読み込まれて動作可能な状態になります。
(DLL単独では動作することはない)
よってこの場合、そのDLLを読み込んでいる親プロセスがいるわけです。
そして最初のソースではDLLを読み込んでいるプロセスは同一であるため、プロセス間の通信も考えなくてよくります。

最初のソースでは、ウィンドウを持つ実行プロセスがいるはずで、これが親となっています。
そして各DLLはIWrapDllというインターフェイスを持つウィンドウが定義されており(違ったらごめん)、それを親が読み込んで親自身が持っているピクチャーボックスの子コントロールとして生成しています。

ということは、ここでそれぞれのDLLが一番簡単な方法で通信する手段は、(通信というにはおかしいけど)IWrapDllインターフェイスに、それぞれがデータ交換するためのメソッド定義し、各DLLはそのインターフェイスを実装します。
親はそれぞれのDLL(が持つウィンドウ)のインスタンス(仮にDLL-AとDLL-B)を生成した後に、
DLL-AにDLL-Bのインスタンスの参照を渡し、DLL-BにはDLL-Aのインスタンスの参照を渡します。DLL-AからDLL-Bに値を渡したい場合は、DLL-A内部からDLL-Bの参照を使用し、IWrapDllで定義したインターフェイスのメソッドを呼び出せばいいのではないでしょうか。

単純に関数呼び出すだけです・・・・だめ?
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2004-02-04 18:19
ども、ほむらです。
-----
Jitta氏へ
引用:

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


なんと、deleteしてはいけなかったのですね。。
内部的にgcを実装しているのかな?
STLはMSDNでSTLと検索すると出てくるページでエラーになるといろいろ書いてありますね。
あれは、そういうことだったのか〜

りばぁ氏へ
引用:

DLLってプロセスじゃないですよね?^^;
DLL間で直接通信するのは、かなりの制限が
あると思われます。


DLLもプロセスですよ。
WIN SDKで作ると実感できると思います。
.NETだとわかりませんけど、SDKならばGetModuleHandle()を利用すれば
プロセスハンドルが手に入ります。
(これが無いとDLL内部の関数が使えない(笑)

共有メモリで使用するのはファイルハンドルだったと思います。
メモリマップファイルとかVirtualAllocで
検索すれば参考になるサイトが出てくるんじゃないでしょうか?
でも、できれば共有メモリは使用しないほうが良いです
難しいらしいので。。いろいろと
あと9x系では利用できません

話は戻りますが共有メモリを使用するくらいならば
ソケット使って聞き耳を立てていたほうがまだましだと思います。
(マルチスレッドになってしまいますけど)

#でも、ここでDLL同士で通信したい理由はフォーム内の入力データを
#渡したいだけですよね?
#SendMessageに一票です。(笑
#タイマーで監視する必要すらなくなるはずです。

#SDKで僕が愛用しているところ。。。
#猫でもわかるプログラミング
#ん〜ネコ大好き^^
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-02-04 19:07
ほむら氏へ

引用:

DLLもプロセスですよ。
WIN SDKで作ると実感できると思います。
.NETだとわかりませんけど、SDKならばGetModuleHandle()を利用すれば
プロセスハンドルが手に入ります。
(これが無いとDLL内部の関数が使えない(笑)


GetModuleHandleはプロセスに読み込まれたモジュールのモジュールハンドルを取得している
のであってプロセスハンドルじゃないですよ(読み込まれたメモリ上の位置)
なのでやっぱりnoderaさんの書き込みのようにDLL間通信というよりは読み込まれた
DLLの関数を直接使う方法を考えたほうがいいと思います。

引用:

#でも、ここでDLL同士で通信したい理由はフォーム内の入力データを
#渡したいだけですよね?
#SendMessageに一票です。(笑


SendMessageはいいと思うのですがこの場合送る先のウィンドウを特定するの
むずかしくないでしょうか?
この場合TextBoxなのでFindWindowも使えないし

引用:

#SDKで僕が愛用しているところ。。。
#猫でもわかるプログラミング
#ん〜ネコ大好き^^


わたしも愛用してます^^
新人にSDKがらみを調べさせる場合「猫先生に聞いてみなさい」と言っています
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-04 21:28
引用:

がるがるさんの書き込み (2004-02-04 17:43) より:

UNIXだと、たまに使う技術だと思うのですが。

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


 反応してしまった(^^;
 んと、メッセージは、MSMQとやらをインストールせねばならず、断念。セマフォは、そんな概念がない!!共有メモリは、「メモリマップファイル」が該当するかな。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-04 23:06
すみません。簡単な「イベントを発生させ、そのイベントでメソッドを呼び出す」に逃げました。

リンクを張っていないので、ここからダウンロードしてください。
なお、ウイルススキャンの入っていないPCでつくっていますので、必ずスキャンしてください。一応、DLLやEXEは抜いています。
また、Borland Together Edition for VS.NETが入っているので、見慣れないファイルがありますが、無視してください。
http://quick-tips.hp.infoseek.co.jp/vs.net/InterDLLMessage.LZH


 1つのアプリケーションと、それぞれWindowsFormが1つあるクラスライブラリです。アプリケーションを起動すると、ボタンが2つあり、それぞれフォームが起動します。Form1にあるテキストボックスに入力すると、Form2にあるテキストボックスに、リアルタイムに反映されます。…どちらもForm1だったような気がするが、みたらわかる!ということで。

 時間ができたらメモリマップファイル(どうもC++からアクセスしないといけないようだったので断念)やドメイン間通信(.NETリモート処理:用意されているのがTCP/IPとHTTPだったので、確かにネットワーク関連ですね。断念)にもチャレンジしたいと思います。
 SendMessageは、他の方の方が詳しそうだからパス(よろしく)

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