トップページ⇒tech
986コメント350KB

COM の世界を斬る!

■ このスレッドは過去ログ倉庫に格納されています
0001IUnknownNGNG
ATL や MFC でラッピングされていない素顔の COM について語り合いましょう。
0281デフォルトの名無しさんNGNG
COM+サーバで一度に1クライアントしか呼べないようにしたいのですが、
どうすればいいのでしょうか?

プールとリサイクルで呼び出し制限を1にしたのですが、いくらでも呼べてしまいます。
0282デフォルトの名無しさんNGNG
_bstr_t retVal = MyPointer->View;
_bstr_t retVal = MyPointer->View();やなくて?
0283VBCOMNGNG
あ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

Comのメソッドを呼ぶときはView()じゃなくてViewなんだあ、
となぜか勝手に思い込んでました。
ありがとうございました。
0284デフォルトの名無しさんNGNG
VariantClearについて質問です。
この関数は対象となるVARIANT変数のAllocSysStringで確保したBSTRの開放や
DispatchなどのインタフェースのReleaseまでしてくれるんでしょうか?
0285284NGNG
この関数の仕様を見誤ると、
メモリリークの原因になってしまうのでコワイです。
知ってる人いたらおね害します。
0286284NGNG
だめだこりゃ
0287デフォルトの名無しさんNGNG
>>284
こんなとこで聞くのが間違い。
ちなみにおれは知らん。
0288284NGNG
>>287
え?
じゃあどこで聞けば委いいですか?
0289デフォルトの名無しさんNGNG
From MSDN...
The function clears a VARIANTARG by setting the vt field to VT_EMPTY.
The current contents of the VARIANTARG are released first.
If the vt field is VT_BSTR, the string is freed.
If the vt field is VT_DISPATCH, the object is released.
If the vt field has the VT_ARRAY bit set, the array is freed.
0290284NGNG
>>289
ありがとう。
でも英語なんで正確な意味がわからなかった。
つまり開放してくれるって事ですか?
0291デフォルトの名無しさんNGNG
>つまり開放してくれるって事ですか?
そーでーす。
0292284NGNG
>>291
ありがとう。
謎は全て解けた!
きみの様ないいやつが沢山いればこの板も安泰だね!
0293John ◆0z.4Is5E NGNG
COMのメリットがよくわかんないんですが、
確かにOSアップグレードする時に、DLL入れ替えるだけでできるのはいいと思うけど、
他になんかある?
0294デフォルトの名無しさんNGNG
えーとですね。COMのメリットはですね。

すいません。ありませんでした。(゚∀゚)
0295デフォルトの名無しさんNGNG
>>293
IEやExcelが操作できるよ
まあ、そんだけかな。
0296デフォルトの名無しさんNGNG
aspから使える
0297デフォルトの名無しさんNGNG
VBからもVCからもVJからもASPからもVBScriptからもJScriptからも使える
0298デフォルトの名無しさんNGNG
>>297
つまり、ソケットが使えない
あるいはクソ言語しか使えないプログラマーのための
上級プログラマーの配慮という事ですな。
0299デフォルトの名無しさんNGNG
>>297 みたいな状況だったら使い道あるかも。
クリティカルな部分はCOMにして信頼できるやつに作らせて、
怪しいプログラマにはCOMクライアントの部分をVBとかでやらせるとか。
0300300NGNG
今だ!オッパイゲット!
0301デフォルトの名無しさんNGNG
>>299
怪しいプログラマは何使わせても危険。
0302デフォルトの名無しさんNGNG
とりあえず怪しい奴にはJava触らせてるけどやっぱ危険
0303デフォルトの名無しさんNGNG
そもそも動かないため、怪しい奴にはC++を触らせるのが吉かと。
0304デフォルトの名無しさんNGNG
怪しい奴には、テスターやってもらえ。ソース触らせるのはヤメトケ。
0305デフォルトの名無しさんNGNG
怪しい奴にはマシンさわらせるのもヤメトケ。
Windows壊されるぞ。
0306デフォルトの名無しさんNGNG
>>293
まじれすつけておこっと
既存インターフェイスと新規インターフェイスのどちらも持てるところ
じゃないかなあ。
ファンクションコードと ver x 以降使えます。みたいな API よりも
実際に必要なインターフェイスをもっているかどうか。
の方が即物的でイイカンジっしょ。
0307デフォルトの名無しさんNGNG
COMのメリットは言語をまたがったコンポーネントの相互運用が可能になること。
たぶんソケット云々って言ってるやつにとっては、そんなのソケットでできるじゃん、
ってことになるんだろうけど、ソケットとは思想が違う。ソケットにデータを送るのではなく、
相手のメソッドを呼び出すということ。それがマシン内でもマシン間でも透過的に
できることがメリット。
0308デフォルトの名無しさんNGNG
つーかな、いちいちマーシャリングコードを
socket使って書くのはだるい、ちゅうねん。
0309デフォルトの名無しさんNGNG
同意。
0310デフォルトの名無しさんNGNG
>>308
COMの意味ない知識を詰め込むよりましだと思うが。
というか、COMにして良かったと思った例を教えて欲しいんだが。
俺はバイトなので、仕方なくCOM使ってるけど
COMが便利だと思える場面は経験してない。
まあ、あえて言えばASPしか使えない奴がプログラマーと名乗ってる組織で
仕事する時は便利だな(w
0311デフォルトの名無しさんNGNG
>310
お前はDQN。
0312デフォルトの名無しさんNGNG
>>310
じゃぁ、今使っているCOMの機能をすべてsocketで実装してください。

まぁ君が今使っている機能ぐらいなら作れるだろうな、
どうせ関数呼び出し程度しか使ってないだろうから。

それに、バイト君は暇だからいいけど、プログラマはそんな
低レベルな実装を時間をかけてわざわざやらないのだよ。
0313デフォルトの名無しさんNGNG
>310
socketでは無くCOMにして良かった例
・COMならsocketで書かなくてならない面倒くさい処理を書かなくてすむ

socketで出来ない処理があるかって言うとそれを探すのは難しい。
しかし、問題はそこじゃないんだよ。
問題は今作っているものにどっちがふさわしいかってこと。
C++でやれることは全てアセンブラでも実現可能だろ。
しかしアセンブラを使用することは少ない。その理由と同じさ。
0314デフォルトの名無しさんNGNG
厨房な質問でスマンが、なんでsocketなんて出てくるんだ?
もしかして、COMを使わないで似たようなことやるには
自前でプロセス間通信して〜って話ですか?
0315デフォルトの名無しさんNGNG
RPCが出てくるなら分かるけど、Socketが出てくる辺り・・・


涙が出ます
0316デフォルトの名無しさんNGNG
リモートにあるオブジェクト同士を透過的に呼び合う機構を擬似的に仕立て
上げてくれる方法が、いまやいろいろ(COM/CORBA/RMIなど)あるっつうのに、
未だにsocketでなんでもやろうとする奴は、究極の車輪再発明野郎だとおもう。

しかもそういう奴は、どういうわけかそのことにプライドを持っている。なんでだ?
0317デフォルトの名無しさんNGNG
>>316
ネットワーク層やデータリンク層に手を入れられるからでしょ。
0318デフォルトの名無しさんNGNG
>>316
COMじゃなくてDCOMだろ
0319デフォルトの名無しさんNGNG
>>318
総称っつーことで
0320デフォルトの名無しさんNGNG
COMってさー、GUIDとかレジストリ使ってる時点で終わってると思う。
0321デフォルトの名無しさんNGNG
>>317
そんな必要があることは、あまりないと思うが…
セキュリティ関係でプレゼンテーション層を変更する必要があることは
多いけど、こういった機構を使っていても、それは可能だしね。
0322デフォルトの名無しさんNGNG
>>320
環境変数よりはマシだと思う。っていうかCLASSPATH逝ってよし。
0323314NGNG
>>315
その一言でわかりました。
つーか、socketなんて個人でいじる場合は
データ通信にしか使わないよな。
0324デフォルトの名無しさんNGNG
>>320
はぁ?
GUIDはむしろ歓迎だろ。
本当にUniversal Uniqueだとしたら
0325デフォルトの名無しさんNGNG
うわっ、釣れた
0326鯛焼きクンNGNG
何かを作る上で「ここまでは決め事にしましょう」っていう
合意がなければ何も作れない。その決め事をフレームワークって
いうかどうかは別としても、おれはその意味をそう捉えている。
COMを使いましょうって決まったのなら、可能な限りその範囲内で
問題を解決しようっていうことだから、もしSocketで十分なものだと
判明しても、間違っているのは最初の合意(COMの採用)であって
COM自体の優劣の話じゃない。
0327デフォルトの名無しさんNGNG
>低レベルな実装を時間をかけてわざわざやらないのだよ。
ソケットでやっても、COMでやってもかかる時間はそんな変わらんよ。

>しかしアセンブラを使用することは少ない。その理由と同じさ。
ネタ?(w
COMの位置付けが全然わかってないようで・・・・
COMとソケットの関係が,C++とアセンブラだってさ(w

>未だにsocketでなんでもやろうとする奴は、究極の車輪再発明野郎だとおもう。
なぜ?
俺はソケットの方が、短時間でできる例しか知らないから、
ソケットでやった方が優れていると主張してんだけど。
車輪の再発明とかほざく奴は、どういうわけかそのことにコンプレックスを持っている。なんでだ?

>上げてくれる方法が、いまやいろいろ(COM/CORBA/RMIなど)あるっつうのに、
そういう奴に限ってXMLは重いと言う罠
まあJavaだけ使うなら、RMI便利だけどね。
どーせ、おまえらIDLすらよくわかってないんだろ。

で、結局COM使って良かった例は
・ASPしか使えない奴がプログラマーと名乗ってる組織で仕事する時
だけなんだね。
0328デフォルトの名無しさんNGNG
>>327
> ソケットでやっても、COMでやってもかかる時間はそんな変わらんよ。
どんなことをやっているのか教えてください。
0329デフォルトの名無しさんNGNG
>>327
> ソケットでやっても、COMでやってもかかる時間はそんな変わらんよ。
「時間は変わらん」というだけなら誰でもできるよ。たとえそれがウソでも。
実例をあげなさい。

> COMの位置付けが全然わかってないようで・・・・
> COMとソケットの関係が,C++とアセンブラだってさ(w
あなたの意見は? COMの位置付けを説明してよ。 笑うだけなら誰でもできるからさ。

> 俺はソケットの方が、短時間でできる例しか知らないから、
> ソケットでやった方が優れていると主張してんだけど。
そりゃソケットの方が短時間でできるならソケットを使うよ。
じゃぁソケットで時間がかかるときはどうするの?
ソケットの方が、短時間でできる例しか知らないのね。

> 車輪の再発明とかほざく奴は、どういうわけかそのことにコンプレックスを持っている。なんでだ?
「そのこと」ってどこにかかっているの?

> そういう奴に限ってXMLは重いと言う罠
なんでいきなりXMLが出てくるの。だれもそんなこと言ってないでしょ。反論になってないよ。

> で、結局COM使って良かった例は
> ・ASPしか使えない奴がプログラマーと名乗ってる組織で仕事する時
なんでASPなの? ウソならだれでも言えるからさ、根拠を言いなって。


的外れな意見ばかりだね。もう少し日本語勉強して出直してきなさい。
0330デフォルトの名無しさんNGNG
>ソケットの方が、短時間でできる例しか知らないのね。
そういうことだから、教えてくれって言ってるんだよ。
で、短時間でできる例がわかってると認識されてるわけだから、
実例挙げなくてもいいのか?

>なんでいきなりXMLが出てくるの。
逝ってよし
329はえらそうな事言ってる割には、知識乏しいみたいだね(w

実例挙げろ、とか根拠とかさ
結局おまえ何もわかってないだろ。
ASPとVBに訂正して欲しいか?

>的外れな意見ばかりだね。もう少し日本語勉強して出直してきなさい
ストレートに書かなきゃわからん奴は、
´_ゝ`<<ひっこんでろ!!
0331デフォルトの名無しさんNGNG
つかな、Socketつかって書くにしても、listenしているポートを
どうやって広告するんだよ。
固定か?/etc/serviceか?ロケータサービスか?
いずれにしてもおめでてーな。
0332デフォルトの名無しさんNGNG
>>331
COMだってそこらへんはしょぼいじゃん(w
0333デフォルトの名無しさんNGNG
ちなみに俺は固定だけどね
0334デフォルトの名無しさんNGNG
たとえばWord.ApplicationをどうやってSocket化するのか、教えれ。

君の話を聞いていると、Inner-Networkなのばっかりやん。
COMのInner-Process, Inner-Machineな部分は無視ですか(w
0335デフォルトの名無しさんNGNG
>>330はヴァカなので放置してください。
0336デフォルトの名無しさんNGNG
XMLってファイル形式の一つという使われ方のほかに
SOAPでやりとりするデータ形式という認識であってる?
結局ここで話しているのはsocket vs COMじゃなくSOAP vs COMなわけ?
SOAPよく知らないから変なこと言ってたらすまん。
0337デフォルトの名無しさんNGNG
>>336
あってない。SOAPとCOMは関係ない。この文脈のXMLってのは単にアフォが
勘違いしてるだけ。
0338336NGNG
>>337
> XMLってファイル形式の一つという使われ方のほかに
> SOAPでやりとりするデータ形式という認識であってる?
↑これも間違い? これが間違い?
0339デフォルトの名無しさんNGNG
>338
XML InfoSetについて調べてみよう。SOAPは<>じゃないよ。
0340デフォルトの名無しさんNGNG
>>339
よくわからんが、分かった。XMLとSOAPについて調べる。ありがと。
0341デフォルトの名無しさんNGNG
>COMのInner-Process, Inner-Machineな部分は無視ですか(w
ごめん無視してた。
開発者側から見て、というつもりだったので

>>337
比喩がわからんおまえがアフォ
つーか、COMのリスクが分かってないのか?
0342デフォルトの名無しさんNGNG
>>341
おまえ、>327じゃねーの?どこが比ゆなんだ?比ゆってなんだかわかってないだろ?
0343DCOM使っている人いるの?NGNG
DCOMでリモートのオブジェクトユーザが死んだ場合って、
オブジェクトの参照カウントってどうなるんだ?
ちゃんとIUnknown::Release()されるの?
Releaseされないで放っておかれると、
オブジェクトユーザが死ぬたびにオブジェクトが
放置されるから、ちゃんとReleaseされるんだよね。(たぶん)
0344デフォルトの名無しさんNGNG
>>343
Releaseされる。DCOMは分散GC実装してるから。
0345デフォルトの名無しさんNGNG
>>344
たぶん、GCできるかどうかどうやって判断するんだ?
ってことだと思うが
0346デフォルトの名無しさんNGNG
>>345
Ping。
0347デフォルトの名無しさんNGNG
>>346
嘘だろ?いくらマイクロソフトだからってそんなことは・・・
0348デフォルトの名無しさんNGNG
ICMPじゃないぞ、言っとくけど。
0349DCOM使っている人いるの? NGNG
>>344 Thanks!

そうそうおもいだした。
MSKBのQ171414にこれのメカニズムと停止方法が書いてある。
PINGを使って生存確認している。当然、誰がどのオブジェクトの
ポインタを持っているのか、AddRefしているかを管理しているわけだ(はずだ)
でオブジェクトユーザが異常死亡すると
その人がAddrefした分、Releaseされるわけだ。で合っているよね。

ということは
IConnectionPoint::Adviseしたオブジェクトが死んだ場合も
IConnectionPoint::Unadviseされるんだよね。

ほかにもIOleObject::AdviseやIDataObject::DAdviseもそうだよね。

それともAdviseしているオブジェクトのメソッドを呼んで
RPC_E_FAULTにでもなったら自分でUnadviseしなければならないの?
0350デフォルトの名無しさんNGNG
DCOMに限るけど COMPLEX PINGとか使って定期的にオブジェクト
が生きているかどうか調べているんじゃなかったでしたけ?

あと、Proxy/StubでAddRefやReleaseも最初と最後しかネットワークに
送信しない様に最適化してるって話も聞いた事がある。

システムでウマーくやってくれてるんじゃないでしょか?
0351DCOM使っている人いるの? NGNG
最適化?なるほど。やっていそうだね。
QueryInterfaceの非効率さに気がついて、
MULTI_QI構造体を用意したくらいだから
0352デフォルトの名無しさんNGNG
IRemUnknown。
0353デフォルトの名無しさんNGNG
>>352
そうですね。そっちの方が詳しく書いてある。

で、Adviseの件はどうなんでしょう?
だれか教えてください。自動的にUnadviseされるなんてやっぱり甘い?
自動的でなければ、せめて、死んだことが死んだ時点か
それに近いタイミングで通知されるような仕組みがあると楽なんだけど。
0354デフォルトの名無しさんNGNG
COMアプリってメモリリークしまくるのが多いけどなんで?
0355デフォルトの名無しさんNGNG
MSが作ってるからでしょ?
0356デフォルトの名無しさんNGNG
どこが作ればメモリリークしませんか。
0357デフォルトの名無しさんNGNG
それはキャッシュです、とか言い張る?(w
0358デフォルトの名無しさんNGNG
なんつーか、VARIANTあたりの設計で、C++みたいな
コンストラクタ/デストラクタ持ってる言語でも
うまく破棄されない場合があった気がする。
0359John ◆0z.4Is5E NGNG
>>356
酸
0360デフォルトの名無しさんNGNG
自分のバグを人のせいにすんな、見苦しい。
0361デフォルトの名無しさんNGNG
>>360
それじゃ話が終わっちゃうじゃん
0362デフォルトの名無しさんNGNG
>>360
禿同
0363デフォルトの名無しさんNGNG
禿同、とかいってるやつは理解してないだけ。
0364デフォルトの名無しさんNGNG
>>363
禿同
0365デフォルトの名無しさん NGNG
実行時のエラーは起きる可能性はいつだってあるから、
バグとも言い切れない
0366デフォルトの名無しさんNGNG
>>365
確保できた資源が、解放時にエラーになる?
それはどのシステムのどんな資源でしょうか?
0367デフォルトの名無しさんNGNG
>>366
禿同
0368デフォルトの名無しさん NGNG
スマートポインターとスコープ
参照カウンター
0369デフォルトの名無しさんNGNG
COMは巨大なオープンソースプロジェクトであるMozillaに採用されているYO!
0370デフォルトの名無しさんNGNG
>>369
まぁた路線変更に迫られるのですが?
0371デフォルトの名無しさんNGNG
路線変更?
0372デフォルトの名無しさんNGNG
Mozilla使ってる奴はCOMに感謝するべき
0373うぴゅNGNG
LinuxやMac OSのMozilla使ってる奴は誰に感謝すべき?
0374デフォルトの名無しさんNGNG
>>373
Mozillaのソース見たことないのか...
0375デフォルトの名無しさんNGNG
ここは悲惨は373の居るスレってことで
0376デフォルトの名無しさんNGNG
XPCOMなんてCOMの足元にも及ばんだろ
inner-processだけだし
http://www-106.ibm.com/developerworks/webservices/library/co-xpcom.html
0377デフォルトの名無しさんNGNG
禿同
0378デフォルトの名無しさんNGNG
>>366
ヒープが壊れたときとか。
0379デフォルトの名無しさんNGNG
>>349
Unadviseされるわけがない。
理由:Proxy/Stubがそこまで考慮していないから。
0380デフォルトの名無しさんNGNG
>で、Adviseの件はどうなんでしょう?
>だれか教えてください。自動的にUnadviseされるなんてやっぱり甘い?

カメレスで済まないけど、Adviceつーても、
単に内部で参照カウントとインターフェースのポインタ
持ってるだけだということを考えませう。

クライアントが落ちてもサーバーが落ちても、
DCOMがRelease( )してくれるのなら
メモリリークはとりあえず発生しない。
0381380NGNG
ただし、
Unadviceはもちろんやってくれないので、
接続のはがれたインターフェースポインタがいつまでも居座ることにはなる。

DCOMがどんな風にRelease( )するかによるけど、安全性の観点から見て、
多分落ちることはないのではないかと思う。
(使うと常にエラーを返すようになると思うが)

ほんとは、そのあたりでエラーを検出したらインターフェースを取り外すように
Proxy/Stubを吐いてくれると無駄が無くていいのだけど。
そこまではしてくれていない。

VC++のウィザードが作るコードは、大雑把にはvectorでインターフェースを複数
保持して、それらをお構いなしにコールしているだけだと思った。
(エラーが返るからまあいいじゃねーか、という考えなのかな?)
■ このスレッドは過去ログ倉庫に格納されています