- PR -

起動中の.NETアプリケーションにCOMコンポーネントからアクセス

投稿者投稿内容
ListRun
会議室デビュー日: 2005/08/25
投稿数: 9
投稿日時: 2006-01-23 14:06
こんにちは。

以下のようなことを実現したいと考えています。
−−−−−−−−−−−
起動中の.NETアプリケーションがある。
そのアプリが保持する変数に、COMコンポーネントからアクセス(値の取得や変更)する
−−−−−−−−−−−

アンマネージコードとの相互運用に関するMicrosoftのヘルプやサンプルを調べてみたのですが、COMコンポーネントから.NETのインスタンスを生成して利用する例ばかりで、既に生成されているインスタンスを取得するような例は見当たりませんでした。
上記のような要求が実現できるのか、できるならMicrosoft推奨の実現方法はどんなものか、を調査しています。
何か情報をご存知の方、教えていただけないでしょうか。
よろしくお願いします。

---
WindowsXP
.NET Framework 1.1
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-01-23 18:08
起動中のアプリケーション(.NET)には
プロセス通信用の受け口は無いんですよね...

だとしたら、実現は難しいと思います。
ListRun
会議室デビュー日: 2005/08/25
投稿数: 9
投稿日時: 2006-01-23 18:59
その後、技術サンプルを見つけたので調べてみましたが、いずれも.NETかCOMが相手を生成して使うようなつくりでした。(多分)
MSDN Online:COM の相互運用性に関するサンプル
http://msdn2.microsoft.com/ja-jp/library/cxcz83xf.aspx

>かるあさん
返信ありがとうございます。
既存のアプリを機能拡張して、新たにCOMコンポーネントからアクセスできるように機能拡張する目的で調査しています。(現状ではプロセス間通信の口は持っていません)
プロセス間通信ですか。。。
その観点でも調べてみます。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-01-23 19:21
引用:

既に生成されているインスタンスを取得するような例は見当たりませんでした。



「そのように」アプリケーションが作られていないと出来ないからです。

Excel や Word に対して「そういうこと」が出来るのは、それらのアプリケーションが「OLE オートメーション」に対応しているからです。

.NET Framework の標準ライブラリは「OLE オートメーション」をサポートしていないので、自力で作りこむのはかなり大変です。

一方、.NET 標準のアプリケーション間通信方法は「リモーティング」になりますが、VB6 以前や MFC, ATL などは登場順から考えても当然のことですが、「リモーティング」をサポートしていません。

よって

引用:

起動中の.NETアプリケーションがある。
そのアプリが保持する変数に、COMコンポーネントからアクセス(値の取得や変更)する



を実現するには

・.NET アプリケーションをリモーティング対応に改修する
・↑と通信する COM を C++/CLI で記述する

とするのが比較的簡単です。


ListRun
会議室デビュー日: 2005/08/25
投稿数: 9
投稿日時: 2006-01-23 20:13
>渋木宏明(ひどり)さん
返信ありがとうございます。

引用:

渋木宏明(ひどり)さんの書き込み (2006-01-23 19:21) より:
引用:

既に生成されているインスタンスを取得するような例は見当たりませんでした。



「そのように」アプリケーションが作られていないと出来ないからです。


上記のようなことはできないのでしょうか。
と言うのは、周りの人間から
「VB6.0では、COMのクラスのinstancingプロパティをmultiuseにしておいて、外部アプリでCreateObjectするとインスタンスを取得できる。」
と聞いています。(表現は正確ではないかもしれません。)
.NETではMultiuseをサポートしている(※1)とのことなので、同じようにできるのではないかと考えていたのですが。


引用:

・.NET アプリケーションをリモーティング対応に改修する
・↑と通信する COM を C++/CLI で記述する

とするのが比較的簡単です。


もちろん、この方法も参考にさせていただきます。
よく知らないのでこれから調べます。。。

※1:MSDN Online「Visual Basic .NET におけるコンポーネントのインスタンス化の変更点」
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbconhowvisualbasic60instancingmapstovisualbasic70.asp
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-01-24 01:05
引用:

上記のようなことはできないのでしょうか。



技術的には可能です。

ですが、既に述べたように .NET の標準クラスライブラリは OLE オートメーションをサポートしていないので、Visual Studio の IDE をちょいちょいいじって、ほんのわずかなコードを追加したくらいでは実現できません。

大部分を自分で作り込む事になります。

引用:

もちろん、この方法も参考にさせていただきます。



あくまで一例です。

要するにプロセス間通信が出来ればいいだけなら、ウィンドウメッセージを使うのでも構わないと思います。
ListRun
会議室デビュー日: 2005/08/25
投稿数: 9
投稿日時: 2006-01-24 08:57
引用:

あくまで一例です。



そもそも今回の調査目的は、前述の要求に対して、どのような実装方法をとるのが正しいかを調べるものでした。
Microsoft推奨の方法があれば一番良いのですが、そんなドキュメントはないのですかね。。。
考えられる実装方法(リモーティング、ウィンドウメッセージ、OLEオートメーション)を挙げる方向で調査を進めようかと思います。
他にも考えられる実装方法はあるのでしょうか。プロセス間通信について調べればいいのかな?
良ければアドバイスお願いします。

ありがとうございます。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-01-24 09:38
引用:

そもそも今回の調査目的は、前述の要求に対して、どのような実装方法をとるのが正しいかを調べるものでした。



あなたが示した仕様(=VB6...)は「OLE オートメーション」そのものを指し示しています。

引用:

Microsoft推奨の方法があれば一番良いのですが、そんなドキュメントはないのですかね。。。



必要なのは「OLE オートメーション」ですか?
それとも、COM オブジェクトと .NET アプリケーションの連携機能ですか?

その辺がはっきりしないと、何を提示すればよいのか分かりません。

.NET アプリケーションに OLE オートメーションの機能を実装するのはあまり現実的ではないと思います。
「.NET における標準的な手法」としては、既に「リモーティング」挙げました。

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