2012-04-20 4 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을 통해 VBScript로 null 개체를 반환하는 가장 좋은 방법은 무엇입니까?

답변

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을 반환 할 수 없습니다. '설정'을 끝내면 작동합니다. 나는 루트 네임 스페이스에 Nothing 클래스를 만들고'If TypeName (TestObj) = "Nothing"Then'을 테스트했습니다. – FuncL

+0

IsNull을 설정하기 전에 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; 
} 

나는 왜 그런지 잘 모르겠다. 인터페이스가있는 경우이 속성을 인터페이스 수준에 적용해야합니다.