- - PR -
DLL同士の通信
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-02-04 10:01
いや、「.NET リモート処理」で良さそうですよ!!ネットワークに限定していません。「アプリケーションドメイン間の通信」とあります。ここで「アプリケーションドメイン」というのは、乱暴に1つのEXE、DLLと考えてください。詳しくはこちらの連載(進んでないけど)。これで扱うのは「アプリケーションドメイン間の通信」なので、アプリケーションドメインが“別のコンピュータ”にあっても手順は変わらない、ということです。 とりあえず、オンラインはこちら。オフラインは、「基本的な .NET リモート処理アプリケーションの構築」トピックを検索してください。 なお、.NETのセキュリティがかかるようですが、同じコンピュータのディレクトリからロードされたアプリケーションドメイン間なら問題ないでしょう。 | ||||||||||||||||
|
投稿日時: 2004-02-04 12:05
みなさん、
新たな情報ありがとうございます。
ってあるのですが、 これは、DLL間の通信でも、SendMessage()の方が 簡単にできるのでしょうか!?
そのようですね! 同一マシン上でも可能のようですね。 けど、うまく動かない(笑) 本題ですが、 MFCはあまり用いたくないので、 SendMessage()かMapViewOfFile()かですかねぇ。 いろいろ調べてみます。 | ||||||||||||||||
|
投稿日時: 2004-02-04 14:39
ところで・・・。
サンプルとしてTextBox1のテキストを、 TextBox2に表示する、、、ってやっていたのですが、 実際のところ、 複数のデータを構造体(またはArrayList)で保持し、 それを別プロセスから参照しようかと思っていたのですが、 この場合もSendMessage()やMapViewOfFile()で 可能なのでしょうか!? 単一のデータしか参照できないってことでしょうか? | ||||||||||||||||
|
投稿日時: 2004-02-04 14:48
ども、ほむらです。
------ 優希氏へ
EXE間ということ、語弊がありますね。 ウィンドウ間といったほうがよかったですね。。。 DLL同士の通信とかはあまり考えたことありません。 現実問題ありえませんから^^;;;;; もしもSendMessage()を利用するのならば 結果を受け取るための構造体をLPARAMにいれて挙げればよいと思いますよ 子画面2でメッセージを発行して子画面1でメッセージを処理する形 ただ、オブジェクト間の結合度高いので分ける必要性に疑問も浮かんできてしまいますけど 以下、別口 後初めてソース見てみたのですけど^^;;;; ポインタの使い方がへんだったりdeleteが無かったりとか .NETのよくわかりませんが。 コードはあっているのでしょうか?
#追記、ここはおかしくなかったですね^^;;;僕の勘違いです。
それに、タイマーの中でDLLをロードしているところとか [ メッセージ編集済み 編集者: ほむら 編集日時 2004-02-04 15:04 ] | ||||||||||||||||
|
投稿日時: 2004-02-04 16:33
こんにちわ。
蛇足になってしまうかもしれませんが。 SendMessageは、メッセージが終わるまで制御が帰ってこないので、 場合によってはPostMessageの方が良いかもしれません。 ちなみに、ウィンドウの無いDLLなどではメッセージを受け取ることは出来ない ので、「直接DLL間で通信」は無理かと思います。 ほむらさんの例は、DLLを呼ぶ画面でのメッセージの処理を言われているのだと 思いますが。 MapViewOfFileは、いわゆる共有メモリ(一般的な呼び方かどうか知りませんが) ですね。これは単に別プロセスなどから同じアドレスに対して読み書きできるように するものですから、実現は特に難しくないと思います。 ---以下さらに蛇足(DLLで実現可能かどうか分かりません) SendMessage、PostMessageはウィンドウにメッセージを送りますが、 PostThreadMessageというのもあり、これはスレッドにメッセージを 送ります。つまり、ウィンドウが無くてもメッセージを送れます。 (かわりにスレッドIDが必要ですが^^;) また、メッセージを受け取る部分も一応自作できます。 方法は、スレッドをひとつ作成し、そのなかで無限ループを作成して そのなかでGetMessageをコールするだけです。 参考にすらならないかもしれませんが・・・^^; | ||||||||||||||||
|
投稿日時: 2004-02-04 17:01
ソースは読んでいないので確かなことは言えませんが、マネージドなクラスをnewすると、deleteしてはいけません。いけないと、MSDNに書いてあるんです、どこか忘れたけど。こちらのスレッドで吼えてます。 #今なら「≒」を使う。。。 ##### 今晩、息子と妻が許してくれれば、サンプル作ってみます。ただし、C#orVB.NET。C++は・・・忘れてる!!ショック。。。 | ||||||||||||||||
|
投稿日時: 2004-02-04 17:27
アドバイス、ありがとうございます。
SendMessage()に関して、
・・・とのことですが、 ウィンドウって Formを生成していないと、、、 ってことですか? それと、MapViewOfFile()なんですが、 「指定した変数を共有メモリに置いておく」という イメージなのですか? "ハンドル"ってモノが何を指すのか よく分からなくって。。。 理解できてなくって、すいませんm(_ _)m
一番初めのソースで どこか間違えてコーディングしてましたかな!?(^^;)
ありがとうございます。 C#でも十分参考になります。 自分もいろいろ調べてみます。 | ||||||||||||||||
|
投稿日時: 2004-02-04 17:43
ども。がると申します。
.NETをしらないというかWindowsの世界を把握していないので 「斜めに」読んでいただけるとありがたいのですが。 Windowsって「プロセス間通信」は存在しないですか? UNIXだと、たまに使う技術だと思うのですが。 (たま〜〜にですが(笑)) キーワードとしては ・セマフォ ・共有メモリ ・メッセージ あたりかなぁ、と。 なにかのヒントにでもなれば幸いです ^^ |