2

オブジェクトを返すか、オブジェクトが存在しない場合は null を返す COM ラッパーを作成しています。VBScript から呼び出す場合、null を返すと、「必要なオブジェクト: 'ComObj.Prop2'」というエラーがスローされます。コード 800A01A8...

C#

public class testCOM
{
    public object Func(int i)
    {
        if (i == 1) return new object();
        if (i == 2) return DBNull.Value;
        return null;
    }
}

VBScript

set ComObj = CreateObject("ClassLibrary1.testCOM")

set TestObj = ComObj.Func(1) 'This Works
set TestObj = ComObj.Func(2) 'Throws "Object required: 'ComObj.Func(...)'" Code 800A01A8
set TestObj = ComObj.Func(3) 'Throws "Object required: 'ComObj.Func(...)'" Code 800A01A8
set TestObj = Nothing        'This is what I want to occur with Func(2) and Func(3)

VT_NULL としてマーシャリングするはずの DBNull.Value を返そうとしましたが、うまくいきませんでした...

.HasValue と .Value を使用して Nullabe<> に似たラッパー オブジェクトを作成したくありません。別の方法としては、Nothing オブジェクト (名前空間なし) を作成することもできません。

If TestObj Is Nothing And TestObj = "Nothing" Then
    'TestObj was nothing or "Nothing"
End If

Nothing オブジェクトを使用すると、COM オブジェクトは、期待される型付きオブジェクトではなく型 Object を返さなければならないため、機能的には同じですが、コードが少し読みにくくなります。

COM 経由で VBScript に null オブジェクトを返す最良の方法は何ですか?

4

2 に答える 2

0

MarshalAsを追加すると、次のことが役立ちます。

[return:MarshalAs(UnmanagedType.IDispatch)]
public object Func(int i)
{
    if (i == 1) return new object();
    if (i == 2) return DBNull.Value;
    return null;
}

理由はわかりませんが。また、インターフェイスがある場合は、この属性をインターフェイスレベルで適用する必要があります。

于 2013-03-22T05:50:49.477 に答える
0

インターフェースの署名をチェックして、それが正しいことを確認してください。私が次のことをした場合:

public object test(int i) {
    object retval = null;
    if (i == 1) {
        retval = new Object();
    } else if (i == 2) {
        retval = DBNull.Value;
    }
    return retval;
}

次のインターフェイス シグネチャを使用:

[DispId(1001)]
object test(int i);

次に、VBScript で次のようにします。

' myObject is my instantiated COM class
WScript.Echo TypeName(myObject.test(1))
WScript.Echo TypeName(myObject.test(2))
WScript.Echo TypeName(myObject.test(3))

私は戻ってきます:

Object
Null
Empty
于 2012-07-16T01:07:34.853 に答える