原因と対処を教えてください。
--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'
残念ながら 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 Sub <String[] の場合> 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!]
これでできました。
要は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))
ばっちりです。
ありがとうございます。
残念ながら 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 Sub <String[] の場合> 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!]
完璧です。ありがとうございました。
完璧です。ありがとうございました。