2012-04-20 31 views
2

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

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) 

を私はがDBNullを返してみました。値は、VT_NULLとしてマーシャリングするはずですが、運はありません...

私は本当にNullabe <と同様のラッパーオブジェクトを書きたいとは思わません.HasValueと.Val UE ...私は好きではない別のオプションは、(なし名前空間内の)何もオブジェクトを作成することですので、私は行うことができます。

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

私は何もオブジェクトを使用する場合は、その後、私のCOMオブジェクトはObject型をreutrnする必要があります期待された型付きのオブジェクトの代わりに、私の目的のために機能的には同じだが、コードを少し読みにくくする。

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

答えて

0

インターフェイスの署名をチェックし、正しいことを確認してください。

public object test(int i) { 
    object retval = null; 
    if (i == 1) { 
     retval = new Object(); 
    } else if (i == 2) { 
     retval = DBNull.Value; 
    } 
    return retval; 
} 
のインタフェース署名付き

:私は次の操作を行う場合は、VBScriptで、その後

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

と、実行します。

' 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 
+0

私は応答を感謝します。残念ながら、あなたの提案は返されたオブジェクト/値を変数に代入しません。代わりに、別の関数TypeNameに直接渡します。あなたのvbscriptが: – FuncL

+0

あなたのvbscriptが 'Set TestObj = myObject.test(2)'を 'Echo TypeName(TestObj) 'にしようとすると、コード800A01A8でエラーになります。どうやら、 'set'はオブジェクトを設定する必要があるので、オブジェクトではないnullを返すことはできません。あなたが 'set'を離れると、それは動作します。私はルート名前空間にNothingクラスを作成し、 'If TypeName(TestObj)=" Nothing "Then'をテストしました。 – FuncL

+0

設定しようとする前にIsNullでテストできませんでしたか? – basiphobe

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; 
} 

私はなぜそう思っています。 インターフェイスがある場合、この属性はインターフェイスレベルで適用する必要があります。

関連する問題