- ベストアンサー
COMコンポーネントの構造の本質的理解ができない
- COMコンポーネントを扱う方法についての質問です。質問文章では、win32oleライブラリを使用してCOMオブジェクトを扱う方法について調査した結果、腑に落ちない点や分からない点があることを述べています。
- 例えば、作成したCOMオブジェクトを扱うためには、そのオブジェクトで定義されているメソッドを参照すれば良いということが分かりました。しかし、参照したメソッドの中に、紹介されているメソッドが見つからなかったと述べています。COMやタイプライブラリについても調べたが、全体像の把握ができないとのことです。
- 質問の要点は、ie.document.all.Item()というメソッドの定義場所や、COMにおいてメソッドがどのように見つけられるのかについてです。相談者はこの点について正しい理解を求めています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>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の仕組みを理解してからの方が良いかも(必須ではないと思いますが)。
その他の回答 (1)
- notnot
- ベストアンサー率47% (4900/10361)
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クラスのオブジェクトの特異メソッドである」という意味が理解できればこのあたり卒業でしょう。
補足
ご指摘ありがとうございます。 ご指摘を受けてもう一度クラス/メソッドの定義をじっくり読み直しました。おかげさまでRubyへの理解が少し深まったような気がします。 しかしまだie.document.all.Item("")という一文が何を意味しているか分かりません。 documentというメソッドはkernelモジュールにもObjectクラスにも定義されていないため、おそらくはCOMコンポーネント側で定義されたものであると思うのですが質問文において述べましたようにie.ole_methods を実行して取得できたメソッドには含まれていませんでした。 よって、祖先クラスにおいて定義されたものだと推測できますが、COMにおけるクラス間の継承関係がどのようになっているのかをどのように知ればよいのか分からないのでどうやって見つければよいのか分かりません。(そもそもProgIDとCOMコンポーネントの対応関係がよくわからず、VBE付属のオブジェクトブラウザを見てもどうやってprogIDとの対応を知ればよいのか手も足も出ない状態です。) 未熟者で何度も質問してすみませんが上述の疑問に対して知っていることがありましたらご教授いただきたいですm(_ _)m
お礼
丁寧に教えて下さりありがとうございます。 質問後、クラスとメソッドの関係からのみIEコンポーネントを理解しようとするのには限界があると思い、DHTMLやDOMに関する文献をネット上で読み漁っていくうちに徐々に理解が高まってきました。 method_missingの仕組みも調べてみましたがどうも今の自分には難しすぎるのでもっとプログラミングに習熟してからもう一度理解に努めてみようと思います