オブジェクトを返す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に返す最適な方法は何ですか?
私は応答を感謝します。残念ながら、あなたの提案は返されたオブジェクト/値を変数に代入しません。代わりに、別の関数TypeNameに直接渡します。あなたのvbscriptが: – FuncL
あなたのvbscriptが 'Set TestObj = myObject.test(2)'を 'Echo TypeName(TestObj) 'にしようとすると、コード800A01A8でエラーになります。どうやら、 'set'はオブジェクトを設定する必要があるので、オブジェクトではないnullを返すことはできません。あなたが 'set'を離れると、それは動作します。私はルート名前空間にNothingクラスを作成し、 'If TypeName(TestObj)=" Nothing "Then'をテストしました。 – FuncL
設定しようとする前にIsNullでテストできませんでしたか? – basiphobe