C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: WSHとの通信


(過去ログ 11 を表示中)

[トピック内 16 記事 (1 - 16 表示)]  << 0 >>

■2613 / inTopicNo.1)  WSHとの通信
  
□投稿者/ Nori (1回)-(2007/04/12(Thu) 16:35:45)

分類:[C# (Windows)] 

最初に利用環境は
OS:WindowsXP Home Edition SP2
開発環境:Microsoft Visual C# 2005 Compiler version 8.00.50727.42 と 秀丸
こんな感じです。

現在、「http://qnd.blog36.fc2.com/blog-date-200511.html」にある解説を参考にして
自分のアプリケーションからWSHを通してJScriptを呼び出そうとしているのですが、
記事中のソースに書かれている「ここで登録するオブジェクトはIDispatchを実装する必要がある」
という部分が理解できていません。

IDispatchそのものに関しては「言語間(や各種実装間)でのデータの扱い方の違いを吸収するための物」
だというのは調べていて分かったのですが、C#で宣言するクラスでIDispatchを実装する方法が
分かりません。

どなたか似たような事を試みた方がいたら、IDispatchの実装とは具体的に何を行えば良いのかなどを
教えて頂きたいです。
引用返信 編集キー/
■2622 / inTopicNo.2)  Re[1]: WSHとの通信
□投稿者/ とっちゃん (101回)-(2007/04/12(Thu) 17:07:32)
とっちゃん さんの Web サイト
No2613 (Nori さん) に返信
> 現在、「http://qnd.blog36.fc2.com/blog-date-200511.html」にある解説を参考にして
> 自分のアプリケーションからWSHを通してJScriptを呼び出そうとしているのですが、
> 記事中のソースに書かれている「ここで登録するオブジェクトはIDispatchを実装する必要がある」
> という部分が理解できていません。
>
参考にしたのは
http://qnd.blog36.fc2.com/blog-entry-10.html
の記事ですか?
月の一覧だと、どれを参考にしたのかわからんのですが?
#複数あるのであればそれぞれの、エントリーのURLを記述することをお勧めします。

> IDispatchそのものに関しては「言語間(や各種実装間)でのデータの扱い方の違いを吸収するための物」
> だというのは調べていて分かったのですが、C#で宣言するクラスでIDispatchを実装する方法が
> 分かりません。
>
ちょっと、調べ方がたりないというか、もう一歩突っ込んだ理解が必要かと。
IDispatch を C# で実装できるかについては、わたしのスキルではわかりませんが
COM(Component Object Model)について、一度学んでみる根性を見せないとだめかも知れません。
#WSH をホスティングする為には、COM(特にAutomation周り)を熟知している必要がありますので

引用返信 編集キー/
■2636 / inTopicNo.3)  Re[1]: WSHとの通信
□投稿者/ 渋木宏明(ひどり) (169回)-(2007/04/12(Thu) 19:14:18)
渋木宏明(ひどり) さんの Web サイト
> 記事中のソースに書かれている「ここで登録するオブジェクトはIDispatchを実装する必要がある」
> という部分が理解できていません。

サンプルソースの入った .zip がダウンロードできないみたいですが、入手してないんですか?

ScriptClasses.TestCls や ScriptClasses.Environment の実装を見れば分かるはずなんですけどね。

自力で実装するとして、この場合はそれほど特殊な努力は要りません。

・public class にする。
・クラス宣言に ComVisible(true) 属性を付加する。

で、C# 2.0 なら IDispatch を影でこっそり実装してくれます。

引用返信 編集キー/
■2650 / inTopicNo.4)  Re[2]: WSHとの通信
□投稿者/ Nori (2回)-(2007/04/12(Thu) 23:10:44)
>とっちゃん様

アドバイスありがとうございます。
これを機にCOMに関して基礎から勉強してみようと思います。

>渋木宏明(ひどり)様

> サンプルソースの入った .zip がダウンロードできないみたいですが、入手してないんですか?
> ScriptClasses.TestCls や ScriptClasses.Environment の実装を見れば分かるはずなんですけどね。

はい。自分が覗いた時点で既にDLできない状態でした。


> 自力で実装するとして、この場合はそれほど特殊な努力は要りません。
>
> ・public class にする。
> ・クラス宣言に ComVisible(true) 属性を付加する。
>
> で、C# 2.0 なら IDispatch を影でこっそり実装してくれます。
>

ありがとうございます!
早速試してみます。


お二方とも、お力添えありがとうございました。
自分も解答する側に回れるように努力します。それでは。

引用返信 編集キー/
■2655 / inTopicNo.5)  Re[2]: WSHとの通信
□投稿者/ 渋木宏明(ひどり) (172回)-(2007/04/13(Fri) 06:21:00)
渋木宏明(ひどり) さんの Web サイト
> で、C# 2.0 なら IDispatch を影でこっそり実装してくれます。

思い出した。WebBrowser コントロールの、ObjectForScripting プロパティに与えるクラス実装と、全く同じ事をすればいいです>IDispatch の実装

結局アレも、ブラウザ内で実行されている JScript/VBScript に、コンテナになっているアプリケーションの機能呼び出しをするためのディスパッチオブジェクトを与えているだけなので。

たぶん、このパターンならサンプルコードも検索できるんじゃないでしょうか。
引用返信 編集キー/
■2668 / inTopicNo.6)  Re[3]: WSHとの通信
□投稿者/ とっちゃん (102回)-(2007/04/13(Fri) 11:47:25)
とっちゃん さんの Web サイト
>で、C# 2.0 なら IDispatch を影でこっそり実装してくれます。
C# 2.0 は、つくってくれるのかぁ...ますます隔世の感が...orz

いい加減まじめにやらねば、本気でついていけなくなりそうだ...orz

引用返信 編集キー/
■2676 / inTopicNo.7)  Re[4]: WSHとの通信
□投稿者/ 渋木宏明(ひどり) (174回)-(2007/04/13(Fri) 12:45:12)
渋木宏明(ひどり) さんの Web サイト
2007/04/13(Fri) 13:57:44 編集(投稿者)

> C# 2.0 は、つくってくれるのかぁ...ますます隔世の感が...orz

1.0 の頃から作ってくれましたよ。
記述の量が少し違うだけっす。

元々 .NET は IDispatch に近い機構を備えているので、属性を指定してマーシャラに任せるだけでオシマイ。

# インプロセスで IDispatch の場合ね。アウトプロセスに関しては何にも助けてくれません ;-p)
# インプロセスでも、カスタムインターフェースを実装する場合は COM のインターフェース定義を C# で書き起こさなければならない場合があるので面倒っちぃです。


引用返信 編集キー/
■2692 / inTopicNo.8)  Re[5]: WSHとの通信
□投稿者/ とっちゃん (103回)-(2007/04/13(Fri) 14:16:21)
とっちゃん さんの Web サイト
No2676 (渋木宏明(ひどり) さん) に返信

>>C# 2.0 は、つくってくれるのかぁ...ますます隔世の感が...orz
>
> 1.0 の頃から作ってくれましたよ。
> 記述の量が少し違うだけっす。
>
ありゃ。そうなんですか。
むー。。。COMまわり最初から切り捨ててるからなぁ...orz

> 元々 .NET は IDispatch に近い機構を備えているので、属性を指定してマーシャラに任せるだけでオシマイ。
>
確かにIDispatch(先祖はvbxだしなぁw)の背景と、.NET の位置づけからみれば、あって然るべきだ...orz
学ぶ姿勢ができてないから、興味がないところは全然だなぁ

> # インプロセスで IDispatch の場合ね。アウトプロセスに関しては何にも助けてくれません ;-p)
おろ?アウトプロセスの部分は、OLE32.DLL がよしなにってやってくれるのでは?
あ、登録まわり?(実行時の方ねw)...あの辺がだめなのかな?
#できないと、WIAが持ってこれない...あれ?WIAつかえる様な事をどっかで読んだ気がするけど...?

> # インプロセスでも、カスタムインターフェースを実装する場合は COM のインターフェース定義を C# で書き起こさなければならない場合があるので面倒っちぃです。
>
>
Dualっすね。こっちは面倒そうだなぁ...作ったことがないからよくわからんけど、
#おためしで、msi.dll のCOMラッパーを中に定義したときには、偉いはまったもんなぁw
#今は面倒だから、参照してるけどww<おかげでいらねーDLLがふえてる...w

引用返信 編集キー/
■2719 / inTopicNo.9)  Re[6]: WSHとの通信
□投稿者/ 渋木宏明(ひどり) (181回)-(2007/04/13(Fri) 17:26:23)
渋木宏明(ひどり) さんの Web サイト
>># インプロセスで IDispatch の場合ね。アウトプロセスに関しては何にも助けてくれません ;-p)
> おろ?アウトプロセスの部分は、OLE32.DLL がよしなにってやってくれるのでは?
> あ、登録まわり?(実行時の方ねw)...あの辺がだめなのかな?

そう。アウトプロセスサーバを「作ること」に関しては .NET はとても冷たいのデス。

> #できないと、WIAが持ってこれない...あれ?WIAつかえる様な事をどっかで読んだ気がするけど...?

アウトプロセスサーバを「使う」のは、「.NET で COM を扱うこと」に共通の問題以外、特に問題ないです。

元々下の方でプロクシ/スタブが動くようになってるので、後は COM 互換レイヤとマーシャラがよろしくやってくれます。

> Dualっすね。こっちは面倒そうだなぁ...作ったことがないからよくわからんけど、

「カスタムだけ」の場合もあるけどね。

とにかく「定義を書きなおさなくてはならない」ところが最高に面倒でつ。
.tlb から取り込めればラクチンなんだけど、手書きしないといけないやつもあるわけで。

> #おためしで、msi.dll のCOMラッパーを中に定義したときには、偉いはまったもんなぁw

.NET から生 COM を扱うのは難しい面もあるので、ラッパを作るなら C++/CLI でスマートポインタを使ったて書いたほうがいいかも。

あるいは、Windows Installer の COM インターフェースを使うことはすっぱりあきらめて、MSI.DLL が公開する API を P/INVOKE で呼び出すタイプのラッパを C# で書くつーのも手。(実は今少しずつやっている人>おれ)

引用返信 編集キー/
■2730 / inTopicNo.10)  Re[7]: WSHとの通信
□投稿者/ とっちゃん (105回)-(2007/04/13(Fri) 20:50:45)
とっちゃん さんの Web サイト
No2719 (渋木宏明(ひどり) さん) に返信
> そう。アウトプロセスサーバを「作ること」に関しては .NET はとても冷たいのデス。
>
VSIDEはRADですからねw<おい!

>>#できないと、WIAが持ってこれない...あれ?WIAつかえる様な事をどっかで読んだ気がするけど...?
>
> アウトプロセスサーバを「使う」のは、「.NET で COM を扱うこと」に共通の問題以外、特に問題ないです。
>
ROTへの登録とかもサポートしてるのかな?<調べろよ!おれ

> 元々下の方でプロクシ/スタブが動くようになってるので、後は COM 互換レイヤとマーシャラがよろしくやってくれます。
>
この辺は、Nativeからでも一緒ですね。
RPC ラッパー部分のおかげで結構手抜きできてるもんなぁww
#実行時にTLBいるけどw

>>Dualっすね。こっちは面倒そうだなぁ...作ったことがないからよくわからんけど、
>
> 「カスタムだけ」の場合もあるけどね。
>
> とにかく「定義を書きなおさなくてはならない」ところが最高に面倒でつ。
> .tlb から取り込めればラクチンなんだけど、手書きしないといけないやつもあるわけで。
>
.idl がサポートしてない文法があったような?
#Nativeでも面倒な世界...w

>>#おためしで、msi.dll のCOMラッパーを中に定義したときには、偉いはまったもんなぁw
>
> .NET から生 COM を扱うのは難しい面もあるので、ラッパを作るなら C++/CLI でスマートポインタを使ったて書いたほうがいいかも。
>
確かにw
ファイルダイアログとかで、いろいろ上がりそうな予感w

> あるいは、Windows Installer の COM インターフェースを使うことはすっぱりあきらめて、MSI.DLL が公開する API を P/INVOKE で呼び出すタイプのラッパを C# で書くつーのも手。(実は今少しずつやっている人>おれ)
>
えー。。。C#ですか。C++/CLIではなくw

wix.dll の中にも幾つかのAPIはラッピングされて入ってますねw
あれ、切り出して、もうちょい色付けして、.NET の中に入れてくれないかなぁw
#.NET は、MSI嫌ってるから難しいかなぁwww

引用返信 編集キー/
■2732 / inTopicNo.11)  Re[8]: WSHとの通信
□投稿者/ 渋木宏明(ひどり) (182回)-(2007/04/13(Fri) 21:30:21)
渋木宏明(ひどり) さんの Web サイト
> ROTへの登録とかもサポートしてるのかな?<調べろよ!おれ

それは主に「アウトプロセスサーバを作る時」の話じゃなくて?

そういうサポートはナッシング。

> えー。。。C#ですか。C++/CLIではなくw

ややこしい構造体とか union が出てこなければ、C# で P/INVOKE しても大した手間じゃないす。

引用返信 編集キー/
■2734 / inTopicNo.12)  Re[9]: WSHとの通信
□投稿者/ とっちゃん (106回)-(2007/04/13(Fri) 22:18:35)
とっちゃん さんの Web サイト
No2732 (渋木宏明(ひどり) さん) に返信
>>ROTへの登録とかもサポートしてるのかな?<調べろよ!おれ
>
> それは主に「アウトプロセスサーバを作る時」の話じゃなくて?
>
ん?イベントインターフェースを、スレッドまたいで渡せるようにっていうんで、
ROTに登録が必要に...

あ、これってばこっちがサーバーじゃねーかw

> そういうサポートはナッシング。
>
残念だなぁ。。。鳴り物入りで突っ込んだ機能なのにwww<WindowsMew


>>えー。。。C#ですか。C++/CLIではなくw
>
> ややこしい構造体とか union が出てこなければ、C# で P/INVOKE しても大した手間じゃないす。
>
構造体は...幾らもないですね。
ファイルハッシュ持ってくるやつくらいじゃないかなぁ?
...ちぇっくちぇっく...
MSIFILEHASHINFO と、MSIPATCHSEQUENCEINFO だけみたいです。
後者は 3.0 で用意されたものですね。。。
#知らないわけだw

引用返信 編集キー/
■2735 / inTopicNo.13)  Re[10]: WSHとの通信
□投稿者/ 渋木宏明(ひどり) (183回)-(2007/04/13(Fri) 22:34:56)
渋木宏明(ひどり) さんの Web サイト
> ん?イベントインターフェースを、スレッドまたいで渡せるようにっていうんで、
> ROTに登録が必要に...

それ GIT (^^;
もちろん GIT もサポート外。

引用返信 編集キー/
■2736 / inTopicNo.14)  Re[11]: WSHとの通信
□投稿者/ Nori (3回)-(2007/04/13(Fri) 23:07:39)
遅くなって申し訳ないです。

無事目的を達成しました。
思っていた以上にアッサリと解決できたので、非常に助かりました。
ありがとうございましたー。
解決済み
引用返信 編集キー/
■2737 / inTopicNo.15)  Re[11]: WSHとの通信
□投稿者/ とっちゃん (107回)-(2007/04/13(Fri) 23:17:02)
とっちゃん さんの Web サイト
No2735 (渋木宏明(ひどり) さん) に返信
>>ん?イベントインターフェースを、スレッドまたいで渡せるようにっていうんで、
>>ROTに登録が必要に...
>
> それ GIT (^^;
> もちろん GIT もサポート外。
>
あ、ほんとだ。自分のソースも m_pGIT ってなってるよ...orz

いかんなぁ...これじゃぁご隠居だw

引用返信 編集キー/
■2738 / inTopicNo.16)  Re[12]: WSHとの通信
□投稿者/ とっちゃん (108回)-(2007/04/13(Fri) 23:20:40)
とっちゃん さんの Web サイト
No2736 (Nori さん) に返信
> 遅くなって申し訳ないです。
>
え?そんな時間経ってないですよ。
#スレが延びてるのはほぼ雑談w

> 思っていた以上にアッサリと解決できたので、非常に助かりました。
> ありがとうございましたー。

なんだかんだと、いろいろとやってくれるみたいですね。>.NET Framework
自分も勉強になりました。>ありがとう渋木さんw
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -