Hatena::Groupmoz-addon

Ci.nsIZIGOROu

2007-10-25生まれて初めての鼻血

Windows Script Component (2)

| 19:43 |  Windows Script Component (2) - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  Windows Script Component (2) - Ci.nsIZIGOROu

prototypeについて(修正1: 2007-10-26T02:26:59+09:00)

結論から言うと事実上使えない。工夫次第で使える。

公開していないメソッド・プロパティ

使える。

プロパティのEnumerate

内部的には可能。

createComponent(追記1: 2007-10-26T01:28:10+09:00)

たとえ同じwsc内でも異なるComponentの呼び出しを介しているのでActiveXObject扱いになる。

なのでcreateComponentで作ったobjectはfor in出来ない。

script要素のsrc属性(追記2: 2007-10-26T01:38:12+09:00)

使えた!!!これは大きい。

まとめ(追記3: 2007-10-26T02:26:59+09:00)

今度この辺りはまとめるけど、

  • 実装の外部化が可能。
  • prototypeも普通に使えるが、大事な事は二つある。
    • 公開するメソッド、プロパティはGlobalオブジェクトのプロパティに置かねばならない
    • Globalオブジェクトのプロパティだからメソッド中にthisと書いたらGlobalオブジェクトを指す
  • って事はprototypeをfor-in出来れば、まるっとGlobalにもってくればいい。(applyしてだけど)

Globalに公開しないとってのが気持ち悪いけど止むを得ないんだろうなー。

そもそもJScriptで書けるけど、JScriptだけの為にあるもんじゃないし。

KansagaraKansagara2012/07/21 06:16What a joy to find such clear thniknig. Thanks for posting!

ftucdwozftucdwoz2012/07/22 01:37Sh9Khg <a href="http://blzjkaulenhj.com/">blzjkaulenhj</a>

bhqxsrbhqxsr2012/07/24 03:49QyzWJ9 , [url=http://xiefoewbcbyn.com/]xiefoewbcbyn[/url], [link=http://sifqkmuuaxqy.com/]sifqkmuuaxqy[/link], http://wyfdyebamytu.com/

2007-10-23

Windows Script Component (1)

| 02:19 |  Windows Script Component (1) - Ci.nsIZIGOROu を含むブックマーク はてなブックマーク -  Windows Script Component (1) - Ci.nsIZIGOROu

Windows Script Componentとは?

(ActiveScriptがサポートする)スクリプト言語でActiveXコントロールが作れる枠組みの事。

MozillaだったらJavaScriptでXPCOMを実装するような感じだと考えて構わない。

wscファイルの作り方

基本はXMLファイルです。複数のコントロールを同時に作る事が可能。

基本的な構造
<?xml version="1.0" encoding="utf-8"?>
<package>
  <component id="Counter" />
  <component id="AnotherComponent" />
</package>
componentの中に記述すること
regstration要素
progid, classid(CLSID), version, descriptinの定義*1
public要素
公開するプロパティ、メソッド、イベントの定義
script要素
各言語での実装*2

registration要素のサンプル

<registration
  description="Sample Counter Component"
  progid="SampleComponent.Counter"
  version="1.00"
  classid="{B49187E5-946E-4A07-A1C1-C0BC02659B94}"
>
  <script language="JScript">
    <![CDATA[
function Register() {
  // このコンポーネントが登録される際に実行される処理
}

function Unregister() {
  // このコンポーネントが削除される際に実行される処理
}
    ]]>
  </script>
</registration>

public要素のサンプル

<public>
  <property name="count">
    <get/>
    <put/>
  </property>
  <method name="incrCount">
    <parameter name="duration"/>
  </method>
  <method name="decrCount">
    <parameter name="duration"/>
  </method>
  <event name="OnIncr" />
  <event name="OnDecr" />
</public>

script要素のサンプル

<script language="JScript">
  <![CDATA[
var description = new SampleComponentCounter();

function IEReplObserverService() {
  this.get_counter = get_counter;
  this.put_counter = put_counter;

  this.incrCount = incrCount;
  this.decrCount = decrCount;
}

var counter = 0;

function get_conter() {
  return counter;
}

function put_counter(newValue) {
  counter = newValue;
}

function incrCount(duration) {
  fireEvent("OnIncr", counter, duration);
  counter += duration;
}

function decrCount(duration) {
  fireEvent("OnDecr", counter, duration);
  counter -= duration;
}
  ]]>
</script>

今の所分かってること

  • 作った後で右クリックしてレジストリに登録しないと使えません
  • Component.prototypeで必要なメソッドやプロパティを定義してもどうも動作しないっぽぃ。公開するプロパティとメソッドはGlobalオブジェクトに居ないとダメみたい。prototypeプロパティ自体には定義は出来る。

まだ試してないこと

  • 公開としていないプロパティ、メソッドが宣言できるか、また使えるかどうか。
  • WSCの中で他のコンポーネントを呼び出した際に、COMイベントを処理出来るか。(多分出来ない)
    • そもそもWScriptオブジェクトが無いので、CreateObject, ConnectObjectが出来ない
    • やるならActiveXObject, object要素のいずれか
    • object要素はevents属性でそのobjectのイベントを使うかどうかある。id属性で指定した値で多分出来るとは思うんだけど、動的にobject要素の生成は出来ないハズ。

まぁ動的に出来たらちと危険かw

*1:レジストリに登録される

*2:これはまた今度