SSブログ

.NETのCOMクラスライブラリからVBSに配列を返す [program]

.NETのCOMクラスライブラリに配列を返す関数を作成して
VBScriptからコールしたらエラーが発生した



仕事でVBS(WSH)を使っています。
稀に.NETのCOMクラスライブラリを作成してVBSからコールしなければならない事があります。
先日VB.NETのCOMクラスライブラリから文字列の配列を返そうとしたところハマッテしまいました。

まずこんなコードを書きました。

Public Function test03() As String()
        Dim TestArray As String() = {"A", "B", "C"}
        Return TestArray
End Function

この関数をVBSから呼び出すと


(ArrayTestがクラスライブラリ内のCOMクラスのオブジェクト)

Dim TestAry03
TestAry03 = ArrayTest.test03()
msgbox VarType(TestAry03)
msgbox UBound(TestAry03)
msgbox TestAry03(0)

VarTypeが8200 (8192(配列)+8(文字列))
UBoundが2
文字列の配列であること、要素が3であることは認識できていますが、
TestAry03(0)と配列の要素にアクセスしようとすると、
「型が一致しません。」というエラーになってしまいます。

あれ、COMの型になっていないのかな。
マーシャルとかいろいろ試してみますが動きません。
試しにVB6から呼び出してみると、要素にアクセスできましたので、
VBSの場合だけの問題だと特定できました。

マイクロソフトのドキュメントやネットを調べても有益な情報はありません。
別に配列でなくても、Dictionaryで返す方法がありますが、
わざわざキーを設定するほどの事はないし、
.NetからWSHのオブジェクトを返すのは迂遠です。
それならば、ArrayListを返すか、
クラスライブラリに型定義をしたコレクションを作ってしまえばいい。

ちなみに、ArrayListは.NET 4.5からVBSでは使えなくなってしまいました。
正確にいうと、.NET 4.5がしかインストールされていない環境では、
.NET 3.5かアクティベーション構成ファイルの設定が必要になります。
しかしこれは、ArrayListをクリエイトできないだけで、
.NET 4.5で作成したCOMクラスライブラリから返されたArrayListにアクセスする事が可能です。

ActiveX(VB6)ではどうだったか?


ここで、VB6の頃を思い出してみました。


Public Function Test03() As String()
    Dim TestArray(2) As String
    TestArray(0) = "A"
    TestArray(1) = "B"
    TestArray(2) = "C"
    
    Test03 = TestArray
End Function


このようなコードをVBSから呼び出し配列の要素にアクセスすると、
やはりエラーになってしまいます。

VB6ではバリアント型の配列として返す必要がありました。

Public Function Test04() As Variant()
    Dim TestArray(2) As Variant
    TestArray(0) = "A"
    TestArray(1) = "B"
    TestArray(2) = "C"
    
    Test04 = TestArray
End Function
※戻り値の宣言は As Variant()でもAs Variantでも動作する


VBScriptの配列はバリアント型の配列


そうです、VBSの配列はバリアント型である事を忘れていました。
これでVB.NETではどうすればいいのかが分かりました。


Public Function test04() As Object()
        Dim TestArray As Object() = {"A", "B", "C"}
        Return TestArray
End Function


Objectの配列として返せばよかったのです。
このようにすると、VarTypeは8204、
要素にアクセスすると、文字列を取得することができるようになりました。



nice!(15)  コメント(0) 

nice! 15

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント