Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2007-10-15COM祭り

TypeName, SafeArrayをScriptControlを使って実装

| 04:27 |  TypeName, SafeArrayをScriptControlを使って実装 - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  TypeName, SafeArrayをScriptControlを使って実装 - Ci.nsIZIGOROu

var VBScriptBridge = function() {
  this.init();
};

VBScriptBridge.prototype = {
  init: function() {
    var sctl = WScript.CreateObject("ScriptControl");
    sctl.Language = "VBScript";
    this.sctl = sctl;
  },
  addCode: function(str) {
    this.sctl.AddCode(str); 
  }
};

var vbs = new VBScriptBridge();
vbs.addCode('Function xTypeName(x):xTypeName=TypeName(x):End Function');
vbs.addCode('Function toSafeArray(arr):toSafeArray = split(arr):End Function');

function TypeName(obj) {
  return vbs.sctl.Run('xTypeName', obj);
}

function toSafeArray(arr) {
  return vbs.sctl.Run('toSafeArray', arr);
}

var arr = [1, 2, 3];

WScript.Echo(typeof arr);
WScript.Echo(TypeName(arr));

WScript.Echo("----");

var sarr = toSafeArray(arr);

WScript.Echo(typeof sarr);
WScript.Echo(TypeName(sarr));

実行結果。

object
JScriptTypeInfo
----
unknown
Variant()

なるほど。

追記 (2007-10-16T04:39:29+09:00)

var vbarray = new VBArray(sarr);

WScript.Echo(vbarray.toArray());

その結果。

1,2,3

ScriptControlのリンク集

| 01:57 |  ScriptControlのリンク集 - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  ScriptControlのリンク集 - Ci.nsIZIGOROu

実は公式の資料が全然無い罠。

  1. no title
  2. no title
  3. no title
  4. no title

WSHとCOMに関するメモ

| 01:06 |  WSHとCOMに関するメモ - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  WSHとCOMに関するメモ - Ci.nsIZIGOROu

ASP/VBScript などのレイトバインド「しか」サポートしていない処理系は、IDispatch を実装していないオブジェクトを扱うことができません。
(オブジェクトの生成くらいはできるかもしれないですが、操作することができません)

*1

レイトバインドでオブジェクトを扱うには、そのオブジェクトが IDispatch を実装している必要があります。

Re: WEBアプリケーションとクライアントアプリの会話

でWSHはレイトバインドしかサポートしないそうなので、IDispatchを実装してないコンポーネントを使う事は出来ないって事みたい。

逆に言えばWSHで使える物はIDispatchを実装している物とも言える。

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を敢えて*2レジストリから探すならば、

レジストリキー
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:中略

*2: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/