メソッドの戻り値で、エラーを判断するのはいくないです。
プロパティなら、なおさら判断しにくい。
という訳で 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)。
開発にあたって、色々と情報を表示したい、というのは常にあります。
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 オブジェクトのカテゴリーを追加する と、
サンプル コマンドラインの文字列を分解 を参考にしてください。