使用COM互操作时,为什么后期绑定修复“ByRef值类型参数不能为空”错误?

时间:2011-01-12 13:33:15

标签: c++ vb.net com com-interop

我在VB.NET项目中使用interop dll来访问MFC项目中的某些函数。

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

为什么?

1 个答案:

答案 0 :(得分:2)

您正在欺骗编译器,阻止它检查您编写的代码是否正确。 Object.Foo()调用是后期绑定的,它在运行时被整理出来,应该调用确切的函数。编译器无法进行任何检查,也不知道对象支持哪些方法。底层管道是COM的IDispatch接口。

毋庸置疑,这可能无法解决任何问题,只是在运行时发出巨响。

不确定为什么要这样做,MFC项目中的.idl可能缺少函数返回值的[out,retval]属性。

相关问题