みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

COMコンポーネントの構造の本質的理解ができない

プログラミングを始めて間もない初心者です。
windowsアプリケーションを制御対象として扱おうと、win32oleライブラリをrequireしてCOMコンポーネントを扱う方法をネット上で色々調べてみたのですがどうも腑に落ちない点・分からない点があるので質問します。
rubyリファレンスマニュアルからリンクされているサイト(http://jp.rubyist.net/magazine/?0003-Win32OLE)において、以下のような記述があります。
>COM ではインスタンスを生成するときに「COM コンポーネント」を指
>定するための ProgID を引数として WIN32OLE.new メソッドを実行し
>ます。 COM コンポーネントとは、Windows に登録された、ある機能
>(たとえば、IE や MS Office の制御機能) を提供するためのもので
>す。この「COM コンポーネント」を利用して作成したインスタンス を>「COM オブジェクト」とこの記事では呼んでいます。 COM オブジェク>トを作成した後は、その COM オブジェクトで定義されている「メソッ>ド」を実行することでそのコンポーネントが提供する機能を実現する
>ことができます。
この文に従えば、作成したCOMオブジェクトを扱う方法を知るためにはCOMオブジェクトで定義されているメソッドを参照すれば良いこととなります。そこで自分もWIN32OLE.new("InternetExplorer.Application")
によって得たCOMオブジェクトにWIN32OLE.ole_methodsを適用することでメソッドの一覧を取得しましたが、前述のサイトで紹介されているie.document.all.Item()というメソッドを探してみてもどこにも見つかりません。
これはどういうことなのかと思い、ネット上で色々とCOMとは何か、タイプライブラリとは何かなどを調べて見ましたが、いまだCOMの全体像の把握ができません。

たとえばrubyの場合、あるオブジェクトに対して使えるメソッドというのはそのオブジェクトが該当するクラスに於いて定義されているメソッド((1))及びkernelモジュールで定義されている組み込みメソッド((2))ですよね。
(初心者なのでこの理解にも間違いがあるかもしれませんがその場合はご指摘お願いします)

このような考え方でいくとWIN32OLE.ole_methodsによって取得したメソッドの一覧は(1)にあたり、document.all.Item()というのは(2)にあたるのではないかという考えもできるかと思うのですが誰か正しい理解をご教授いただきたいです。

質問が長くなってしまいましたがie.document.all.Item()というメソッドがどこに定義されているのか、そういったメソッドの定義場所はCOMにおいてどのように見つけるのか、そこだけでもいいのでよろしくお願いします。

投稿日時 - 2009-03-20 18:17:16

QNo.4812897

すぐに回答ほしいです

質問者が選んだベストアンサー

>documentというメソッドは~~ie.ole_methodsを実行して取得できたメソッドには含まれていませんでした。

含まれてますよ。

C:\temp>irb -rwin32ole
irb(main):001:0> ie=WIN32OLE.new("InternetExplorer.Application")
=> #<WIN32OLE:0x2ba3be4>
irb(main):002:0> ie.ole_methods
=> [QueryInterface, AddRef, Release, GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, Invoke, GoBack, GoForward, GoHome, GoSearch, Navigate, Refresh, Refresh2, Stop, Application, Parent, Container, Document, TopLevelContainer, Type, Left, Left, Top, Top, Width, Width, Height, Height, LocationName, LocationURL, Busy, Quit, ClientToWindow, PutProperty, GetProperty, Name, HWND, FullName, Path, Visible, Visible, StatusBar, StatusBar, StatusText, StatusText, ToolBar, ToolBar, MenuBar, MenuBar, FullScreen, FullScreen, Navigate2, QueryStatusWB, ExecWB, ShowBrowserBar, ReadyState, Offline, Offline, Silent, Silent, RegisterAsBrowser, RegisterAsBrowser, RegisterAsDropTarget, RegisterAsDropTarget, TheaterMode, TheaterMode, AddressBar, AddressBar, Resizable, Resizable, GetTypeInfoCount, GetTypeInfo, GetIDsOfNames, Invoke]

Rubyでは、名前の英大文字・小文字は区別されますが、Win32側では区別されないようです。

irb(main):003:0> ie.gohome #上記ではGoHomeだが小文字でOK。newしただけだとdocumentが無いので、HOMEページを表示させる
=> nil
irb(main):004:0> ie.visible=true
=> true
irb(main):005:0> ie.Document # 上記表示のままDocumentで呼んでみる
=> #<WIN32OLE:0x2f69cb0>
irb(main):006:0> ie.document.ole_methods # 小文字で呼んでみる
=> [たくさん~~~~]

OLEのmethodsは、method_missingを使って実現されているので、普通のメソッドとは異なります。混乱すると思うので、クラスとメソッドの関係を十分学ぶまで手を出さない方が良いと思います。methods_missingの仕組みを理解してからの方が良いかも(必須ではないと思いますが)。

投稿日時 - 2009-03-22 19:40:01

お礼

丁寧に教えて下さりありがとうございます。
質問後、クラスとメソッドの関係からのみIEコンポーネントを理解しようとするのには限界があると思い、DHTMLやDOMに関する文献をネット上で読み漁っていくうちに徐々に理解が高まってきました。

method_missingの仕組みも調べてみましたがどうも今の自分には難しすぎるのでもっとプログラミングに習熟してからもう一度理解に努めてみようと思います

投稿日時 - 2009-04-09 01:36:35

ANo.2

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

WIN32OLE#ole_methods のようにクラス名とメソッド名を#で続けて書かれた物は、インスタンスメソッドです。
メソッドには、クラスメソッドと、インスタンスメソッドがあり、# を使って表記されるのはインスタンスメソッドです。ですから、
ie=WIN32OLE.new("InternetExplorer.Application")
ie.ole_methods
と、オブジェクトに対して作用させます。

>あるオブジェクトに対して使えるメソッドというのはそのオブジェクトが該当するクラスに於いて定義されているメソッド((1))及びkernelモジュールで定義されている組み込みメソッド((2))ですよね。

少し違います。
そのオブジェクトが属するクラスまたはその(親を含めた)祖先クラス(orメソッド)で定義されているインスタンスメソッドです。

例えば数字の 1 に対して使えるメソッドは、下記のクラス/モジュールで定義されたものです。
Fixnum, Integer, Precision, Numeric, Comparable, Object, Kernel
(これらは、1.class.ancestors で調べられます)

「クラスメソッドとはclassクラスのオブジェクトの特異メソッドである」という意味が理解できればこのあたり卒業でしょう。

投稿日時 - 2009-03-22 10:43:20

補足

ご指摘ありがとうございます。
ご指摘を受けてもう一度クラス/メソッドの定義をじっくり読み直しました。おかげさまでRubyへの理解が少し深まったような気がします。

しかしまだie.document.all.Item("")という一文が何を意味しているか分かりません。
documentというメソッドはkernelモジュールにもObjectクラスにも定義されていないため、おそらくはCOMコンポーネント側で定義されたものであると思うのですが質問文において述べましたようにie.ole_methods
を実行して取得できたメソッドには含まれていませんでした。

よって、祖先クラスにおいて定義されたものだと推測できますが、COMにおけるクラス間の継承関係がどのようになっているのかをどのように知ればよいのか分からないのでどうやって見つければよいのか分かりません。(そもそもProgIDとCOMコンポーネントの対応関係がよくわからず、VBE付属のオブジェクトブラウザを見てもどうやってprogIDとの対応を知ればよいのか手も足も出ない状態です。)

未熟者で何度も質問してすみませんが上述の疑問に対して知っていることがありましたらご教授いただきたいですm(_ _)m

投稿日時 - 2009-03-22 17:26:16

あなたにオススメの質問