2011-01-12 46 views
2

我在一個VB.NET項目中使用interop dll來訪問MFC項目中的一些功能。使用COM互操作時,爲什麼後期綁定修復「ByRef值類型參數不能爲空」錯誤?

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可讓我使用「function2」,而無需先將api對象分配給對象變量。 仍然不確定爲什麼它使用後期綁定運行完美時,但我猜測,我在做這些時避免了一些運行時類型檢查在「互操作層之間」? – Stokke 2011-01-13 13:20:02

回答

2

你在愚弄編譯器,阻止它檢查你是否編寫了正確的代碼。一個Object.Foo()調用是延遲的,它在運行時被整理出來,應該調用確切的函數。編譯器不能做任何檢查,它不知道對象支持哪些方法。底層管道是COM的IDispatch接口。

不用說,也許這並不能解決任何問題,它只是在運行時發出一聲巨響。

不知道爲什麼你這樣做,也許MFC項目中的.idl缺少函數返回值的[out,retval]屬性。

+0

謝謝你的回覆。我的問題應該更清楚:這是一個運行時錯誤。 第一個示例使用給定的錯誤崩潰應用程序。第二個例子運行順利。 但是你的評論讓我重新檢查了idl,發現它是OK的時候,BEGIN_DISPATCH_MAP和DISP_FUNCTION代替了函數,問題原來就是這樣。 (請參閱我原來的問題的評論) – Stokke 2011-01-13 13:16:48

相關問題