Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2007-10-15COM祭り

WSHから見たCOMの基礎とレジストリ

| 22:16 |  WSHから見たCOMの基礎とレジストリ - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  WSHから見たCOMの基礎とレジストリ - Ci.nsIZIGOROu

はじめに

COMに関してJScriptやWSHから関連する概念の中、ProgID, CLSID, IID, TypeLibはきちんと理解すべき事柄です。

そんな訳でよく分からない中、色々調べてみました。

それぞれについて簡単に説明すると、

CLSID
COMコンポーネントの識別子(GUID)
IID
COMコンポーネントが実装するインターフェースの識別子(GUID)
ProgID
CLSIDを参照する文字
TypeLib
COMコンポーネントを他の言語からも使えるようにする物

と言う具合です。

これらの値が実際WSH等とどう関係してくるかについて調べてみます。


レジストリとCLSID, IID, TypeLib

レジストリのエントリにCLSID, IID, TypeLibが含まれています。

CLSID
HKEY_CLASSES_ROOT\CLSID
IID
HKEY_CLASSES_ROOT\interface
TypeLib
HKEY_CLASSES_ROOT\TypeLib

上記以外のエントリにも入っていたりしますが、基本的にはCLSID, interface, TypeLib以下にあるようです。

また、CLSID以下にある{CLSID}の下にはProgID名とTypeLibへのGUIDへの参照値が入っている事があります。

例えば、Scripting.FileSystemObjectのCLSIDから見ると

レジストリキー
HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228} FileSystem Object
HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}\ProgID Scripting.FileSystemObject
HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228}\TypeLib {420B2830-E718-11CF-893D-00A0C9054228}

と言う構造になっていて、ここにあるTypeLibの値を見ると、

レジストリキー
HKEY_CLASSES_ROOT\TypeLib\{420B2830-E718-11CF-893D-00A0C9054228}\1.0\0\win32 C:\WINDOWS\system32\scrrun.dll

のようになっており、このDLLをOLEVIEWなどで開けばIDLを見る事が出来ます。

開いてみるとinterfaceは以下の物です。

  1. IDictionary
  2. IFileSystem
  3. IDriveCollection
  4. IDrive
  5. IFolder
  6. IFolderCollection
  7. IFileCollection
  8. IFile
  9. ITextStream
  10. IFileSystem3
  11. IScriptEncoder

このうち試しにIDictionaryについてIIDを敢えて*1レジストリから探すならば、

レジストリキー
HKEY_CLASSES_ROOT\Interface\{42C642C1-97E1-11CF-978F-00A02463E06F} IDictionary
HKEY_CLASSES_ROOT\Interface\{42C642C1-97E1-11CF-978F-00A02463E06F}\TypeLib {420B2830-E718-11CF-893D-00A0C9054228}

のようになります。TypeLibのGUIDが一致してるのに注目です。

WSHとProgID, CLDID, TypeLibの関連

ProgID

例えば、ActiveXObjectで指定する値やWScript.CreateObject()で指定する値はProgIDになります。

var shell = new ActiveXObject("Shell.Application");

あるいは、

var shell = WScript.CreateObject("Shell.Application");

といった具合で使います。

CLSID

WSF(Windows Script File)の<object>要素ではProgIDでもオブジェクトが作成できますが、CLSIDでも作成出来ます。

<?xml version="1.0" encoding="utf-8" ?>
<package xmlns="Windows Script Host">
  <job>
    <object id="fso" progid="Scripting.FileSystemObject" />
  </job>
</package>

と、

<?xml version="1.0" encoding="utf-8" ?>
<package xmlns="Windows Script Host">
  <job>
    <!-- HKEY_CLASSES_ROOT\CLSID\{0D43FE01-F093-11CF-8940-00A0C9054228} -->
    <object id="fso" classid="clsid:0D43FE01-F093-11CF-8940-00A0C9054228" />
  </job>
</package>

は同じ事です。

TypeLib

前と同じくWSFの中ですが、reference要素と言うタイプライブラリへの参照を指定する際に使います。

具体的にはタイプライブラリで宣言されている定数をグローバルオブジェクトに取り込むのがreference要素の役割です。

<?xml version="1.0" encoding="utf-8" ?>
<package xmlns="Windows Script Host">
  <job>
    <reference object="Scripting.FileSystemObject" />
  </job>
</package>

と、

<?xml version="1.0" encoding="utf-8" ?>
<package xmlns="Windows Script Host">
  <job>
    <reference guid="420B2830-E718-11CF-893D-00A0C9054228" />
  </job>
</package>

は同じ結果で、実際の定数は次のようにアクセスします。

<?xml version="1.0" encoding="utf-8" ?>
<package xmlns="Windows Script Host">
  <job>
    <reference guid="420B2830-E718-11CF-893D-00A0C9054228" />
    <script type="text/javascript">
      WScript.Echo(ForReading);
      WScript.Echo(ForWriting);
      WScript.Echo(TristateTrue);
    </script>
  </job>
</package>

*1:OLE Viewで普通に分かるw

gptdemgptdem2011/04/08 01:19ijGilW <a href="http://wwzyvhbvsksn.com/">wwzyvhbvsksn</a>, [url=http://jnnfvnmdoyjk.com/]jnnfvnmdoyjk[/url], [link=http://tguillpyxbsz.com/]tguillpyxbsz[/link], http://oloeayvufkke.com/