API実現と「タイプライブラリ」実現の違いとは?

解決


ポント  2003-10-23 15:32:51  No: 79948  IP: [192.*.*.*]

「ショートカットを作成するには?(Ⅱ)」の質問では、ご親切なレスをいただきありがとうございました。大変お世話になっております、ポントです。

「猿頁」さんのページでご紹介されている「ショートカットを作成したい」http://homepage3.nifty.com/salv/hp-old/03pc/qvb/03vbpg001.htmのページをコピーしてショートカットの作成は成功しました。ありがとうございます。このページの中に、

>さぁて、じゃあどうしろって言うかというとですね。

>タイプライブラリを使ってVBの機能を拡張しちゃいましょう

>ということになります。

>Win98では、APIではなく「インターフェイス」という形で、きちんとショートカット回りをいじくれるような機能を 提供しているんですね。したがってこいつはDeclare宣言などではなく、「タイプライブラリ」でVBで扱える オブジェクトなどを追加する、という形で使用可能になります。

と書かれてあるのですが、APIでショートカット作成を実現したコードを見ますと、沢山コードがかかれてあり、(?)だったのですが、これを、「タイプライブラリ」で実現しますと、ただ用意されたクラスや関数を呼び出せば終わりというとても簡単なものになってしまいます。しかし、まったく同じことを実現しているのに、APIの方の沢山のコードは、「タイプライブラリ」の方では、いったいどこへ行ってしまったのだろうと、わきあがる疑問でいっぱいです。もしよろしければ、ご教授お願いします。

(「タイプライブラリ」のソースコード「SHELLLNK.ODL」を見ましても、クラスや関数が宣言されているだけで、APIのようなコードは見当たりません。これが、

>Win98では、APIではなく「インターフェイス」という形で、きちんとショートカット回りをいじくれるような機能を提供している

ということなのでしょうか? APIではなく「インターフェイス」という部分が分かりません・・・。)

編集 削除
魔界の仮面弁士  2003-10-24 01:48:25  No: 79949  IP: [192.*.*.*]

そもそもVBは、コンポーネント・オブジェクト・モデル(COM:コム)という技術———あるいは、アクティブエックス(ActiveX)と呼んだ方が馴染みがあるかも知れませんが——の上に成り立っています。
そしてCOMでは、インターフェイス(Interface)と呼ばれる物を通して、処理を行うようになっています。

なお、COMテクノロジ自体は非常に奥の深い分野なので、ここで詳しく解説する事はできません。
幾つかの専門書(ISBN:4881357794 など)も出ていますので、興味があれば調べてみてください。


> APIではなく「インターフェイス」という部分が分かりません
「インターフェイス」とは、『メソッドやプロパティの宣言の集まり』の事を指しています。
これはある意味では「クラス」に似ていますが、クラスとは異なり、プログラムコードの「実装」がありません。あくまで、メソッドの定義だけなのです。

例えば、ショートカット作成に使うIPersistFileインターフェイスやIShellLinkAインターフェイスは、以下のようなメソッドを持っています。
http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/ifaces/ishelllink/ishelllink.asp
http://msdn.microsoft.com/library/en-us/com/htm/cmi_n2p_99ph.asp

(上記MSDNの解説と併せて、ちょくとさんのページも参考になるかも知れません)
http://yokohama.cool.ne.jp/chokuto/urawaza/interface/IShellLink/
http://yokohama.cool.ne.jp/chokuto/urawaza/interface/IPersistFile/


しかしVB6では、インターフェイスを定義することが出来ないため、それらを「タイプライブラリ(Type-Library)」という物にしておき、それを通してアクセスする事になります。


> APIでショートカット作成を実現したコードを見ますと、
あれはCOMと言えども、内部的にはAPIを呼び出している事には変わり無いので、突き詰めて行けば「Declareだけでもできない事は無い」という事を示すサンプルですね。

ただ、COM APIを直接Declareで呼び出すというのは、VBのコーディングとしては、あまり一般的な手法ではありません。
通常はタイプライブラリを使って利用するか、もしくは、インターフェイスを定義可能な言語でDLLを作って、それを呼び出すようにします。

編集 削除
魔界の仮面弁士  2003-10-24 02:12:58  No: 79950  IP: [192.*.*.*]

> 内部的にはAPIを呼び出している事には変わり無いので
K.J.K.さんの書かれたサンプルを、私が解説するというのは烏滸がましいので……自分の書いたコードを例にして解説してみます。


例えば、IEの履歴を処理するインターフェイスとして、IUrlHistoryStg2という物があります。
これには「履歴のクリア」を行う ClearHistoryメソッドという物が用意されています。

例えば、タイプライブラリを利用して呼び出す場合は、以下のように、わずか数行で済ますことができます。
http://groups.google.co.jp/groups?selm=0c1d01c341c8%2479685090%24a001280a%40phx.gbl&oe=UTF-8&output=gplain

ところが、これをタイプライブラリ無しで(COM APIの直接呼び出しで)実現しようとすると、以下のように、非常に長い物となってしまいます。(^_^;)
http://codeguru.earthweb.com/mfc/comments/45982.shtml


上記のサンプル2つを比べてみてください。
  hr = CoCreateInstance(〜, lngPUrlHistoryStg2)
の部分は、
  Set UrlHist = New 〜
に相当します。

そしてその後の、
  hr = DispCallFunc(lngPUrlHistoryStg2, vtblOffsetClearHistory, 〜)
が、
  UrlHist.ClearHistory
に相当します。

そして最後の
  hr = DispCallFunc(lngPUrlHistoryStg2, vtblOffsetRelease, 〜)
は、
  Set UrlHist = Nothing
となります。


ショートカット作成の場合は、上記 IUrlHistoryStg2.ClearHistory の場合と異なり、複数のインターフェイスを利用する必要がある(しかも、メソッドに幾つかの引数を指定しなければならない!)ので、さらにややこしいコードを書く事になりますが、原理はほぼ同じです。

編集 削除
トグル  2003-10-24 16:40:40  No: 79951  IP: [192.*.*.*]

横から失礼します。
http://codeguru.earthweb.com/mfc/comments/45982.shtml
のサンプルで、vtbl (virtual function table ?) の列挙値は
どこから得たものでしょうか?
ご教授お願いします。

編集 削除
 2003-10-25 00:45:21  No: 79952  IP: [192.*.*.*]

> のサンプルで、vtbl (virtual function table ?) の列挙値は
> どこから得たものでしょうか?

インターフェイスのv-table は c++ の v-table と同じものなので
1つの関数のアドレスを4バイトとして、
関数の並びを見て、計算したんでしょう

編集 削除
トグル  2003-10-26 13:08:35  No: 79953  IP: [192.*.*.*]

回答ありがとうございます。

> 関数の並びを見て、計算したんでしょう

他のインターフェースについて、関数の並びが載っている
WEBサイトをご存知でしたら、教えて下さい。

編集 削除
 2003-10-27 06:17:44  No: 79954  IP: [192.*.*.*]

タイプライブラリが公開されていないインターフェイスの構造は、
作者の記したドキュメントにたよることになります。
MSのものなら、MSDNに載ってます。

ただ、それを知った所で、VBで何をするのですか?

編集 削除
ポント  2003-10-31 14:52:25  No: 79955  IP: [192.*.*.*]

ありがとうございました。返答遅くなってすみませんでした。

コンポーネント・オブジェクト・モデル(COM:コム)という技術について勉強してみます。以下の本ですね、ご紹介ありがとうございます。 
「VB  COM—ActiveX、MTS、DCOM、WindowsDNAを支えるテクノロジー活用術 ルイス,トーマス【著】」

編集 削除