2011-01-12 1 views
2

저는 VB.NET 프로젝트에서 interop dll을 사용하여 MFC 프로젝트의 일부 기능에 액세스합니다.COM interop을 사용할 때 후기 바인딩이 "ByRef 값 형식 매개 변수가 null 일 수 없음"오류를 수정하는 이유는 무엇입니까?

Dim bIsSupposedToWork As Boolean = True 
Dim api As API = GetObject(, "MyProject.API") 

api.Function1() ' << Function1 returns void, and this works OK 

' Function2 returns a long: 
If Not bIsSupposedToWork Then 
    ' This next line crashes the application with the message "ByRef value type parameter cannot be null"- error 
    api.Function2() 
Else 
    ' But this works fine: 
    Dim o As Object = api 
    o.Function2() 
End If 

왜?

+0

MFC 클래스에서 DISP_FUNCTION에 대한 반환 값 매개 변수는 VT_EMPTY로 정의되었습니다. VT_I4로 변경하면 먼저 api 객체를 객체 변수에 할당하지 않고 "function2"를 사용할 수 있습니다. 아직 런타임에 바인딩을 사용할 때 완벽하게 실행되는 이유를 모르겠지만이를 수행 할 때 "interop layers in between"에서 런타임 유형 검사를 피할 것이라고 생각하고 있습니다. – Stokke

답변

2

올바른 코드를 작성했는지 확인하지 못하게 컴파일러를 속일 수 있습니다. Object.Foo() 호출은 런타임에 바인딩되므로 런타임에 정렬되어 정확한 함수를 호출해야합니다. 컴파일러는 어떤 검사도 수행 할 수 없으며 객체가 지원하는 메소드를 알지 못합니다. 기본 배관은 COM의 IDispatch 인터페이스입니다.

아마도이 말은 아무 것도 해결하지 못할 수도 있지만, 실행시 큰 소리를냅니다.

MFC 프로젝트의 .idl에 함수 반환 값에 대한 [out, retval] 특성이 없을 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 내 질문에 명확해야합니다 : 이것은 런타임 오류입니다. 첫 번째 예제에서는 주어진 오류로 응용 프로그램을 중단합니다. 두 번째 예제는 부드럽게 실행됩니다. 그러나 귀하의 의견을 내게 다시 idl을 확인하고 언제 문제가 밝혀 지 기능에 대한 BEGIN_DISPATCH_MAP 및 DISP_FUNCTION 확인을 발견했다. (내 원래 질문에 대한 의견보기) – Stokke

관련 문제