VB.NET から遅延バインディングを使用して呼び出したい COM コンポーネントがあります (面倒な Primary Interop Assembly - PIA メソッドを使用)。
COM メソッドの IDL 署名は次のようになります。
HRESULT Send([in]BSTR bstrRequestData,
[out]VARIANT *pvbstrResponseData,
[out]VARIANT *pvnExtCompCode,
[out,retval]int *pnCompletionCode);
したがって、VB.NET 用語では 2 つの「ByRef」パラメーターと戻り値です。
私はこのメソッドを次のように呼び出そうとします:
Dim parameters(2) As Object
parameters(0) = "data"
parameters(1) = New Object()
parameters(2) = New Object()
Dim p As New ParameterModifier(3)
p(1) = True
p(2) = True
Dim parameterMods() As ParameterModifier = {p}
objReturn = MyObject.GetType().InvokeMember("Send", _
BindingFlags.InvokeMethod, _
Nothing, _
MyObject, _
parameters, _
parameterMods, _
Nothing, _
Nothing)
これは例外で見事に失敗します: {"Invalid callee. (Exception from HRESULT: 0x80020010 (DISP_E_BADCALLEE))"}
これは、parameterMods 配列で何か間違ったことをしていることを意味すると思います。ParameterMods配列の値を「True」に設定してコメントアウトすると、機能するためです。もちろん、[out] パラメータであるパラメータは更新されないため、意図したとおりに機能しません。
メソッドにも戻り値があるため、他に考慮すべき点はありますか? MSDNの例は、例に戻り値がないことを除いて、私が行っていることとほとんど同じです。どんな助けでも大歓迎です。