プログラミングを始めて間もない初心者です。
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においてどのように見つけるのか、そこだけでもいいのでよろしくお願いします。
No.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の仕組みを理解してからの方が良いかも(必須ではないと思いますが)。
丁寧に教えて下さりありがとうございます。
質問後、クラスとメソッドの関係からのみIEコンポーネントを理解しようとするのには限界があると思い、DHTMLやDOMに関する文献をネット上で読み漁っていくうちに徐々に理解が高まってきました。
method_missingの仕組みも調べてみましたがどうも今の自分には難しすぎるのでもっとプログラミングに習熟してからもう一度理解に努めてみようと思います
No.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クラスのオブジェクトの特異メソッドである」という意味が理解できればこのあたり卒業でしょう。
この回答への補足
ご指摘ありがとうございます。
ご指摘を受けてもう一度クラス/メソッドの定義をじっくり読み直しました。おかげさまでRubyへの理解が少し深まったような気がします。
しかしまだie.document.all.Item("")という一文が何を意味しているか分かりません。
documentというメソッドはkernelモジュールにもObjectクラスにも定義されていないため、おそらくはCOMコンポーネント側で定義されたものであると思うのですが質問文において述べましたようにie.ole_methods
を実行して取得できたメソッドには含まれていませんでした。
よって、祖先クラスにおいて定義されたものだと推測できますが、COMにおけるクラス間の継承関係がどのようになっているのかをどのように知ればよいのか分からないのでどうやって見つければよいのか分かりません。(そもそもProgIDとCOMコンポーネントの対応関係がよくわからず、VBE付属のオブジェクトブラウザを見てもどうやってprogIDとの対応を知ればよいのか手も足も出ない状態です。)
未熟者で何度も質問してすみませんが上述の疑問に対して知っていることがありましたらご教授いただきたいですm(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- C言語・C++・C# ActiveXコントロールを.NETにインポートできない??? 2 2023/05/02 02:50
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- C言語・C++・C# C# 継承の問題で programに示された拡張をすべて含んだ上で,クラス Mammal に,そのオ 1 2022/07/22 09:48
- 日本語 〈場所を示す「に」と「で」〉 という誤り 36 2022/11/12 15:04
- WordPress(ワードプレス) ワードプレスのパーマリンク設定について 1 2023/02/11 19:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビーリアルのユーザー名を変え...
-
パソコンのスクリーンセーバー...
-
VBScriptでExcel(2019)上のデー...
-
パイソンエラーについて
-
pythonエラー
-
C言語の入力した文字を反転させ...
-
pandasでsqlite3にテーブル作成...
-
C++のCreateFile関数で、ASCII...
-
VBA
-
1、Rstudioで回帰直線を求める...
-
VBA メモ帳の上書き保存がしたい
-
Accessで文字列のバイト数読み込み
-
(再質問)エクセルのマクロボ...
-
WinSCPで画像のように puttyを...
-
じゃんけんのプログラムを作っ...
-
rubyの正規表現について
-
プログラミング
-
教えてください
-
パイソンでテキストファイルが...
-
パイソンでpy ファイルと p...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
get() と find() の違いについて
-
A1の値をファイル名に指定した...
-
エクセルVBA オートフィルタで...
-
エラー「メソッドまたはデータ...
-
VBAで型が一致しないエラー(バ...
-
教えてください。vb5.0
-
Csvファイルの最終行を取得する...
-
try ~ catch構文が使えない
-
実行時エラー450:引数の数が一...
-
RubyでバイナリデータをIOスト...
-
メソッド定義の構文のdefって
-
rubyのメソッドについて
-
【Ruby on Rails】モデルのメソ...
-
Ruby on Rails 「attr_accessor...
-
COMコンポーネントの構造の本質...
-
Rails4でJSONのParseErrorを判定
-
Pythonでcall_user_funcを行う
-
【C++】DxlibのLoadgraph()を使...
-
正規表現で両端に文字列を置換
-
スレッドとコンテナ
おすすめ情報