Click here to visit our sponsor

実装篇


目次


エラーの発行

メソッドの戻り値で、エラーを判断するのはいくないです。
プロパティなら、なおさら判断しにくい。
という訳で COM の慣習にならって HRESULT を投げます。

HRESULT にエラーコードを返すと、クライアント(として使っている言語)はエラーを発生させます。
  (VB,VBScript や JScript など。ただしC言語などは HRESULT を戻り値として処理)

エラーコードは最上位ビットを立てたものです。詳しくは、資料ページにて。

<resource id="RES_E_INVALIDARG">引数は省略できませんb</resource>

<script type="text/JScript">
<![CDATA[

var E_INVALIDARG = 0x80070057;

function ErrorInfo(no, res)
{
    var err = new Error();

    err.number = no;
    err.description = getResource(res);

    return err;
}

function Method1(arg1, arg2)
{
    if (arg1 == null) {
        throw ErrorInfo(E_INVALIDARG, "RES_E_INVALIDARG");
    }

    ...

    return true;
}

]]>
</script>

試しにエラーコードを 0x7FFFFFFF 以下にしてみると、0x80004005 (E_FAIL) に変更になってしまいました。
つまり、最上位ビットは立てないとダメ (Severity code)

(資料ページ) HRESULT


デバッグ

開発にあたって、色々と情報を表示したい、というのは常にあります。
VBScript の MsgBox を使ってもいいのですが、
イベントを使って、数値や文字列をクライアントに渡すのが何かと便利でしょう。

<public>
    <event name="OnOutput" />
</public>

こうしておいて、何か表示したいとき、

function Hoge()
{
    ...
    fireEvent("OnOutput", "色々");
    ...
}

もちろん、引数をもっと増やしてもいいでしょう。

ホストは WSH がやり易いと決め付けて、例にしてみます。

function Fire_OnOutput(str)
{
    WScript.Echo(str);
}

var obj = WScript.CreateObject("XXXX.XXXXXXX", "Fire_");

...

Fire_ というプレフィックスを付けたイベント名にした関数を実装し、
CreateObject の第2引数に、それを指定します。
そうすると、そのオブジェクトの持つイベントに接続できます。


オブジェクトを公開する (注意)

get プロパティで、Arrayオブジェクト (JScript) を渡したとします。

  Component
  └ Array  (プロパティ get_Array)

通常、このようなオブジェクトモデルを取る場合、
get_Array の返すインスタンスは、不変であるのが普通でしょう。

var objArray = new Array();    // コンポーネントの生成時に、作る

function get_Array()
{
    return objArray;
}

コード的には、こんな感じ。

function Method()    // どこぞのメソッド
{
    ...

    // インスタンスはそのままで、初期化する
    objArray.length = 0;

    ...
}
function Method()    // どこぞのメソッド
{
    ...

    // 前の内容を破棄して、新たなインスタンスを作る
    objArray = new Array();

    ...
}

このように、他のメソッドで、
objArray のインスタンス(実態)を入れ替える事は、
公開したインスタンスを宙に浮かせる事になります。


配列のようなプロパティを作る

呼び出す言語によってはあれだが、配列っぽく出来るという話です。
コレクションが配列のようにふるまえるのは、このカラクリを使っています。

宣言

<public>
    <property dispid="0" name="Item">
        <get/ internalName="get_Item">
        <put/ internalName="put_Item">
    </property>
</public>

コード

var Item = new Array();

function get_Item(arg1)
{
    return Item[arg1];
}
function put_Item(arg1, newValue)
{
    Item[arg1] = newValue;
}
</public>

引数を足しただけ。1つ以上してもよし。

呼び出し側

obj.Item(0) = 1;
a = Item(0);

カッコが [] ではなく () だ。 (JScript)
ところが、デフォルトプロパティにしてるのに、
プロパティ名(Item)を省略できなかった。(put側のみ)
何故??


カテゴリーを決める

出来上がった WSC にカテゴリーを追加すると、カコイイです。(^^;
別にしなくても問題ないので、わからない場合、無視していいです。

カテゴリーとして既存のものは、

  • オートメーションオブジェクトである
  • 初期化しても安全なオブジェクトである
  • 実行しても安全なオブジェクトである

などがあります。

やり方は、COM オブジェクトのカテゴリーを追加する と、
サンプル コマンドラインの文字列を分解 を参考にしてください。


おわりに

このページの満足度は・・・

素晴らしい!
まあまあ、良いかも
自己満足感がよくわかるページですね
まったくもって説明不足


WSCページトップ

HOME

兄弟ページ 姉妹ページ
Click here to visit our sponsor