- - PR -
DLL同士の通信
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-02-04 17:44
SendMessageの引数を見ていただければ分かるかと思いますが、 ウィンドウハンドルが必要なのです。
表現は微妙ですがイメージは合ってそうですね^^; んーと、要するに、ファイルに読み書きするようなことを メモリに対して行うような感じです。 ハンドルは、ファイルハンドルと同じように考えてもらえば いいかも・・・ ちなみに、構造体も直接共有メモリに置けますよー。 | ||||||||||||
|
投稿日時: 2004-02-04 17:49
こんにちわ。
プロセス間通信の考え方は当然あるのですが、 (3つの例は全部可能だと思います) DLLってプロセスじゃないですよね?^^; DLL間で直接通信するのは、かなりの制限が あると思われます。 揚げ足取りのようで申し訳ないのですが・・・ | ||||||||||||
|
投稿日時: 2004-02-04 17:55
おぉ! そうですか(笑) 助言、有難う御座います。 | ||||||||||||
|
投稿日時: 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で定義したインターフェイスのメソッドを呼び出せばいいのではないでしょうか。 単純に関数呼び出すだけです・・・・だめ? | ||||||||||||
|
投稿日時: 2004-02-04 18:19
ども、ほむらです。
----- Jitta氏へ
なんと、deleteしてはいけなかったのですね。。 内部的にgcを実装しているのかな? STLはMSDNでSTLと検索すると出てくるページでエラーになるといろいろ書いてありますね。 あれは、そういうことだったのか〜 りばぁ氏へ
DLLもプロセスですよ。 WIN SDKで作ると実感できると思います。 .NETだとわかりませんけど、SDKならばGetModuleHandle()を利用すれば プロセスハンドルが手に入ります。 (これが無いとDLL内部の関数が使えない(笑) 共有メモリで使用するのはファイルハンドルだったと思います。 メモリマップファイルとかVirtualAllocで 検索すれば参考になるサイトが出てくるんじゃないでしょうか? でも、できれば共有メモリは使用しないほうが良いです 難しいらしいので。。いろいろと あと9x系では利用できません 話は戻りますが共有メモリを使用するくらいならば ソケット使って聞き耳を立てていたほうがまだましだと思います。 (マルチスレッドになってしまいますけど) #でも、ここでDLL同士で通信したい理由はフォーム内の入力データを #渡したいだけですよね? #SendMessageに一票です。(笑 #タイマーで監視する必要すらなくなるはずです。 #SDKで僕が愛用しているところ。。。 #猫でもわかるプログラミング #ん〜ネコ大好き^^ | ||||||||||||
|
投稿日時: 2004-02-04 19:07
ほむら氏へ
GetModuleHandleはプロセスに読み込まれたモジュールのモジュールハンドルを取得している のであってプロセスハンドルじゃないですよ(読み込まれたメモリ上の位置) なのでやっぱりnoderaさんの書き込みのようにDLL間通信というよりは読み込まれた DLLの関数を直接使う方法を考えたほうがいいと思います。
SendMessageはいいと思うのですがこの場合送る先のウィンドウを特定するの むずかしくないでしょうか? この場合TextBoxなのでFindWindowも使えないし
わたしも愛用してます^^ 新人にSDKがらみを調べさせる場合「猫先生に聞いてみなさい」と言っています | ||||||||||||
|
投稿日時: 2004-02-04 21:28
反応してしまった(^^; んと、メッセージは、MSMQとやらをインストールせねばならず、断念。セマフォは、そんな概念がない!!共有メモリは、「メモリマップファイル」が該当するかな。 | ||||||||||||
|
投稿日時: 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は、他の方の方が詳しそうだからパス(よろしく) |