人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

文字列の配列を戻すCOMをC#で作ったのですが、VBScriptから利用できません。
原因と対処を教えてください。

--COMソース
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ComTest
{
[Guid("1DF9FE96-566F-4f51-B42C-XXXXXXXXXXXX")]
public interface IComTest
{
string[] Messages();
}

[ClassInterface(ClassInterfaceType.None)]
[ProgId("Test.COMCOM")]
[Guid("B0E6E99D-B93C-4793-8077-XXXXXXXXXXXX")]
public class ComTest : IComTest
{
public string[] Messages()
{
string[] messages = new String[2];
names[0] = "Hello";
names[1] = "World!";
return names;
}
}
}

--VBScript
Dim test
Set test = CreateObject("Test.COMCOM")

obj = test.Messages()
wscript.echo "上限:" & ubound(obj)
wscript.echo "値(0):" & obj(0)

--VBScript実行結果
上限:1
test.vbs(12, 1) Microsoft VBScript 実行時エラー: 型が一致しません。: 'obj'


●質問者: Gabegin
●カテゴリ:コンピュータ
✍キーワード: Class C# C-4 ECHO F-4
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● freemann
●18ポイント

これでできました。

要はVBScriptには、型が無いのでObjectの配列として返す事のようです。

C#側(COM)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace COMTest
{
 [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
 [Guid("311344D6-1ACD-4815-8661-XXXXXXXXXXX")]
 [ComVisible(true)]
 public interface IComTest
 {
 object[] Messages(
 );
 }
 [Guid("B4EFEC9F-4212-461e-B61D-XXXXXXXXXX")]
 [ClassInterface(ClassInterfaceType.None)]
 [ComVisible(true)]
 [ProgId("Test.COMCOM")]
 public class Class1 : IComTest
 {
 public Class1()
 {
 }

 public object[] Messages()
 {
 object[] data = new object[2];
 data[0] = "Hello";
 data[1] = "World";
 
 return data;
 
 }
 }
}

VBScript側

Dim test
Set test = CreateObject("Test.COMCOM")

dim obj
obj = test.Messages()

wscript.echo Typename(obj)
wscript.echo "上限値:" & ubound(obj)
wscript.echo Typename(obj(0))
wscript.echo "値(0):" & CStr(obj(0))
wscript.echo "値(1):" & CStr(obj(1))
◎質問者からの返答

ばっちりです。

ありがとうございます。


2 ● cx20
●52ポイント ベストアンサー

残念ながら VBScript では String の配列が使えないようですね・・・

VBA では String の配列で取得可能でした。以下は Excel VBA での結果です。

Sub ShowTypeName()
 Dim test
 Set test = CreateObject("Test.COMCOM")
 
 Dim obj
 obj = test.Messages()
 
 Debug.Print "TypeName(obj) :[" & TypeName(obj) & "]"
 Debug.Print "TypeName(obj(0)) :[" & TypeName(obj(0)) & "]"
 Debug.Print "VarType(obj) :[" & VarType(obj) & "]"
 Debug.Print "VarType(obj(0)) :[" & VarType(obj(0)) & "]"
 Debug.Print "上限値 :[" & UBound(obj) & "]"
 Debug.Print "値(0) :[" & CStr(obj(0)) & "]"
 Debug.Print "値(1) :[" & CStr(obj(1)) & "]"

End SubString[] の場合>
TypeName(obj) :[String()]
TypeName(obj(0)) :[String]
VarType(obj) :[8200] … vbArray + vbString
VarType(obj(0)) :[8] … vbString
上限値 :[1]
値(0) :[Hello]
値(1) :[World!]

<Object[] の場合>
TypeName(obj) :[Variant()]
TypeName(obj(0)) :[String]
VarType(obj) :[8204] … vbArray + vbVariant
VarType(obj(0)) :[8] … vbString
上限値 :[1]
値(0) :[Hello]
値(1) :[World!]
◎質問者からの返答

完璧です。ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ