文字列の配列を戻す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'

回答の条件
  • 1人10回まで
  • 13歳以上
  • 登録:2010/02/14 11:44:46
  • 終了:2010/02/15 22:45:42

ベストアンサー

id:cx20 No.2

cx20回答回数603ベストアンサー獲得回数1072010/02/15 22:37:28

ポイント52pt

残念ながら 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!]
id:Gabegin

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

2010/02/15 22:44:05

その他の回答(1件)

id:freemann No.1

freemann回答回数304ベストアンサー獲得回数472010/02/15 16:46:07

ポイント18pt

これでできました。

要は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))
id:Gabegin

ばっちりです。

ありがとうございます。

2010/02/15 20:20:38
id:cx20 No.2

cx20回答回数603ベストアンサー獲得回数1072010/02/15 22:37:28ここでベストアンサー

ポイント52pt

残念ながら 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!]
id:Gabegin

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

2010/02/15 22:44:05
  • id:heke2mee
    自信が無いのでコメントで失礼します。
    こちらに同じような質問があったので参考になるのではないでしょうか

    http://oshiete1.goo.ne.jp/qa5369047.html
  • id:Gabegin
    コードに誤りが有り、あまり参考になりませんでした。
    せっかく教えてもらったのですが。。
  • id:cx20
    試してないのでコメントにて。
    C# 側のコードを String の配列ではなく Object の配列にしてみてはどうでしょうか?
  • id:Gabegin
    エラーは変わりませんでした。

    以下、やった事です。
    --C#ソース--
    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
      {
        Object[] Messages();
      }
      
      [ClassInterface(ClassInterfaceType.None)]
      [ProgId("Test.COMCOM")]
      [Guid("B0E6E99D-B93C-4793-8077-XXXXXXXXXXXX")]
      public class ComTest : IComTest
      {
        public Object[] Messages()
        {
          Object[] names = new Object[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 obj
    --エラーメッセージ--
    上限:1
    test.vbs(6, 1) Microsoft VBScript 実行時エラー: 型が一致
    しません。
  • id:cx20
    >wscript.echo obj
    wscript.echo obj(0)

    でもダメでしょうか?

    あと、

    WScript.Echo TypeName(obj)
    WScript.Echo TypeName(obj(0))

    で、型情報を確認することができると思います。
  • id:Gabegin
    行けました!
    ちょいミスでしたが、全く気づいていませんでした。
    回答に一言で良いので登録してください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません